首页 > 解决方案 > 嵌套异步/等待使用

问题描述

鉴于下面的示例,如果我想await player.play(),我是否必须添加async两个地方,因为foo最终将是执行的功能?

例子:

const foo = (player) => {

    let foo = videojs;

    foo.addEventListener('ready', () => {
       player.play()
    }

}

可不可能是:

const foo = async (player) => {

    let foo = videojs;

    foo.addEventListener('ready', async () => {
       await player.play()
    }

}

await foo();

或者:

const foo = (player) => {

    let foo = videojs;

    foo.addEventListener('ready', async () => {
       await player.play()
    }

}

foo();

标签: javascript

解决方案


如果你想foo返回一个在.play()-returned 承诺解决时解决的承诺,那么你可以 promisify addEventListener

像这样的东西:

const whenEvent = (elem, event) => new Promise((resolve) =>
    elem.addEventListener(event, resolve, { once: true })
);

const foo = async (player) => {
    await whenEvent(videojs, 'ready');
    await player.play();
};

foo().then(() => console.log("foo resolved"));

请注意,promise 只能解析一次,而事件侦听器可以被多次调用。所以这个承诺版本(whenEvent)只会捕获第一个事件,然后停止监听。whenEvent(因此foo)应该再次调用以处理下一次发生的事件。


推荐阅读