javascript - 嵌套异步/等待使用
问题描述
鉴于下面的示例,如果我想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();
解决方案
如果你想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
)应该再次调用以处理下一次发生的事件。
推荐阅读
- javascript - 为什么我的 Javascript 循环只返回第一个值?
- javascript - 渲染运行两次
- c++ - 在没有小部件的情况下以编程方式使用 QCompleter
- python - 如何使用python打开触摸键盘?
- php - 将 $_SESSION 值和其他输入数据(选择)从 jQuery 传递到 saveindb.php 文件
- excel - VBA XML 返回
- javascript - 多级下拉 Bootstrap 4,子菜单与父下拉列表顶部对齐
- laravel - Laravel 路由组未正确使用
- python - 如何使用 rpy2 api 从 python 脚本中正确获取 R sessionInfo()?
- kotlin - Android-Things:将 gpiocallback 函数迁移到暂停协程函数