gpt4 book ai didi

javascript - 我可以使用 async/await 来等待 JavaScript 中的多个事件吗?

转载 作者:搜寻专家 更新时间:2023-11-01 05:20:30 24 4
gpt4 key购买 nike

考虑以下情况:

const waitForEvent = async (api) => {
api.on('eventOne', () => {
return 'eventOne';
})


api.on('eventTwo', () => {
return 'eventTwo';
})


api.on('eventThree', () => {
return 'eventThree';
})

api.load();
}

我想做的是在异步函数内的 api 变量上设置事件回调,触发 api.load() 函数,然后返回事件先发生的,在本例中是 eventOne|eventTwo|eventThree

问题是,这种语法不好,而且这个例子不起作用。我找不到使用 async/await 实现此目的的任何方法,不得不恢复为这样的 promise :

const waitForEvent = (api) => {
return new Promise(resolve) => {
api.on('eventOne', () => {
resolve('eventOne');
})


api.on('eventTwo', () => {
resolve('eventTwo');
})


api.on('eventThree', () => {
resolve('eventThree');
})

api.load();
}
}

所以我的问题是,这可以使用 async/await 来完成吗?无论如何,这可以使用新的 async/await es7 语法来完成吗?

最佳答案

由于 async/await 允许我们以同步方式(词法自上而下)编写异步结构,因此实际上并没有特定的方法来执行 3 行不同的代码(或更准确地说,陈述)同时进行。

理想的 API 是 Promise.race .

首先,您将 api 回调转换为返回 promise :

const apiPromiseBuilder = (api) => (eventName) => new Promise(resolve => api.on(eventName, () => {
resolve(eventName);
}));

然后你参加所有你需要的赛事:

const waitForEvent = (api) => {

const apiPromise = apiPromiseBuilder(api);

const promiseRace = Promise.race([
apiPromise('eventOne'),
apiPromise('eventTwo'),
apiPromise('eventThree')
]);

api.load();

return promiseRace;
};

或者使用async/await:

async function waitForEvent(api) {

const apiPromise = apiPromiseBuilder(api);

const promiseRace = Promise.race([
apiPromise('eventOne'),
apiPromise('eventTwo'),
apiPromise('eventThree')
]);

api.load();

const firstResult = await promiseRace;

return firstResult;
};

关于javascript - 我可以使用 async/await 来等待 JavaScript 中的多个事件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43747136/

24 4 0
文章推荐: javascript - 未调用 componentDidMount
文章推荐: javascript - 检索隐藏元素的 innerText
文章推荐: javascript - 带有反斜杠的 JSON 解析错误
文章推荐: javascript - 点击
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com