确保异步操作的顺序

时间:2016-05-12 16:01:06

标签: javascript node.js asynchronous

我正在寻找可以在JavaScript中使用的模式,以确保以特定顺序处理某些异步回调的结果。我可以想办法做到这一点,但不是优雅的方法,所以我很欣赏JavaScripty实现这一目标的方法。

直接用例是我从EventEmitter接收我需要处理的事件。我通过以下方式处理它们:

  1. 立即执行数据库操作
  2. 首先执行HTTP请求,然后执行数据库操作
  3. 我有约束,数据库操作的执行顺序必须与从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
    ...
    

0 个答案:

没有答案