我正在寻找可以在JavaScript中使用的模式,以确保以特定顺序处理某些异步回调的结果。我可以想办法做到这一点,但不是优雅的方法,所以我很欣赏JavaScripty实现这一目标的方法。
直接用例是我从EventEmitter接收我需要处理的事件。我通过以下方式处理它们:
我有约束,数据库操作的执行顺序必须与从EventEmitter收到的相应事件的顺序相同。
由于HTTP请求是异步的,因此可能会发生相应的数据库操作被新事件所取代,该新事件不需要执行HTTP请求并且可以立即执行数据库操作。
但我也可以想象这种情况会发生在更深层嵌套的异步调用层次结构......
示例:
let events = require('events');
let emitter = new events.EventEmitter();
emitter.on('event', (count) => {
if (count % 2) {
immediateDBOperation(count);
} else {
asyncHTTPOperation(count, () => immediateDBOperation(count));
}
});
function immediateDBOperation(count) {
// Need to be processed in correct order
console.log(count);
}
function asyncHTTPOperation(count, callback) {
setTimeout(() => callback(count, 'foo'), 1500);
}
let count = 0;
setInterval(() => emitter.emit('event', count++), 1000);
输出:
1
0
3
2
...