javascript - 使用异步回调处理事件
问题描述
如何使用 async/await 或其他技术在消息处理程序中使用异步回调?消息可以随时出现,因此在异步函数中处理一条消息时,另一条消息可以进入并更快地处理。如果消息的顺序很重要,这是一个问题。
socket.on('message', async (msg) => {
if(msg === 1){
await doFirstThing();
}
else if (msg === 2){
await doSecondThing();
}
});
如果doFirstThing()
需要一段时间,则消息doSecondThing()
可能会进来并且处理得太快。我正在考虑添加到一个数组然后承诺它,但我不知道如何将另一个承诺推到“堆栈”上,可以这么说,如果另一个承诺(或更多)正在等待..
解决方案
您可以拥有一个持久的外部 Promise 变量,每次出现新消息时重新分配该变量以确保正确的顺序。
let prom = Promise.resolve();
socket.on('message', (msg) => {
prom = prom.then(() => {
if(msg === 1){
return doFirstThing(); // return the Promise instead of `await`
} else if (msg === 2){
return doSecondThing();
}
}).catch(handleErrors); // make sure to include this
});
您需要能够无限期地链接到 Promise,因此绝不能有任何拒绝prom
- 这.catch
是必不可少的。
每次有消息到来时,它都会在新的.then
回调运行之前等待最后一条消息完成处理。
推荐阅读
- java - 插入@OneToMany 关系对象与子表中未插入父ID 的子表?
- android - BiometricPrompt:如何加密几个字符串?
- ruby-on-rails - Ruby on Rails + Carrierwave:为什么我的显示页面上的 image_tag 返回错误?
- java - ARROW_DOWN 键在 selenium 中不起作用( Key Down / Up 事件仅对修饰键有意义。)
- visual-studio - 一个 MEX 文件来管理所有函数并在 DLL 中绑定它们
- laravel-5.5 - 如何在 Laravel 5.5 中使用文件数组验证输入框数组
- javascript - 如何从类外部访问类函数,相同的 .ts 文件
- vb.net - 如何使用字符串数组根据 DGV 列过滤行?
- vba - 如何为字段的每个唯一值生成随机记录?
- spring - Spring Batch Unable to locate Spring NamespaceHandler for XML schema namespace 错误