nodejs异步系列最终回调在其他函数之前触发

时间:2017-05-26 18:19:40

标签: node.js asynchronous

async.series([
    function(callback) {
        setTimeout(function(){ console.log("2"); }, 1000 * 10);
        callback();
    },
    function(callback) {
        console.log("1"); }, 1000 * 10);
        callback();
    },
], function(err) { 
      console.log("done");
 });

我正在尝试执行上面的代码。我希望结果是
1
2
完成了

但我得到结果为
1
做过
2

有人可以帮我解决为什么在系列回调之前执行最终回调吗?

2 个答案:

答案 0 :(得分:0)

您的代码无法编译

 function(callback) {
        console.log("1"); }, 1000 * 10);
        callback();
 }

我想你想写:

function(callback) {
        setTimeout(function(){ console.log("1"); }, 1000 * 10);
        callback();
},

我认为你必须使用promise而不是async lib。

类似的东西:

new Promise(resolve => {
    setTimeout(function(){ console.log("1"); resolve(); }, 1000 * 10);
})
.then(() => {
    setTimeout(function(){ console.log("2"); Promise.resolve(); }, 1000 * 10);
    })
.then(() => {
    console.log('done');
});

答案 1 :(得分:0)

callback参数的想法是,在您的案例setTimeout中完成异步任务时,您可以调用它。

当达到超时时间时,调用setTimeout的函数参数,也就是应该调用callback时:

async.series([
  function(callback) {
    setTimeout(function() { console.log("1"); callback(); }, 1000 * 10);
  },
  function(callback) {
    setTimeout(function() { console.log("2"); callback(); }, 1000 * 10);
  },
], function(err) { 
  console.log("done");
});

因为每个条目都是串行调用的,所以代码将按如下方式执行:

  • 等待10秒
  • 输出1
  • 致电callback转到下一个条目
  • 等待10秒
  • 输出2
  • 致电callback转到最终功能
  • 输出done