async.series在完成当前之前执行回调

时间:2014-01-29 07:39:24

标签: javascript asynchronous

这是结构

var invalid = false;

async.series([
   function(callback)
   {
      someAsync.do(something, function(data)
      {
         if(data == null) invalid = true;

         callback();
      }
   },
   function(callback)
   {
      if(invalid) callback();

      someAsync.doSomethingImportant(something, function(data)
      {
         if(data == null) invalid = true;

         callback();
   }
], function()
{
   if(invalid) doThis();
   else doThat();
});

问题是第一个异步功能成功运行的第二个异步功能NEEDS。

有时async.series在语句invalid = true之前调用callback()并崩溃我的应用程序。此外,有时它也有效。

你能帮帮我吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

您的代码看起来是正确的,但如果您依赖第一个函数的结果,则可以尝试使用async.waterfall

async.waterfall([
   function(callback)
   {
      someAsync.do(something, callback);
   },
   function(data, callback)
   {
      if(data == null) { 
          callback(new Error('no data'));
      } else {
          someAsync.doSomethingImportant(something, callback)
      }
   },
   function (data, callback) {
      if (data == null) { 
          callback(new Error('no data'));
      } else {
          callback();
      }
   }
], function(err)
{
   if (err) { 
       doError();
   } else {
       doThat();
   }
});

答案 1 :(得分:0)

问题解决了!

我没有使用我自己的error control,而是使用它的默认值:

async.series([
   function(callback)
   {
      someAsync.do(something, function(data)
      {
         if(data == null) callback(true);
         else callback();
      }
   },
   function(callback)
   {    
      someAsync.doSomethingImportant(something, function(data)
      {
         if(data == null) callback(true);
         else callback();
   }
], function(invalid)
{
   if(invalid) doThis();
   else doThat();
});

如果您通过callback(err),它将跳过所有其他异步并执行回调。

答案 2 :(得分:-1)

而不是:

[function a () { async_1(); },
 function b () { async_2(); }]

function c () {}

你需要的是

function a () {
    async_1(function (data) {
        function b (data) {
            async_2(function (result) {
                function c (success) { console.log(success); }
                c(result);
            });
        }

        b(data);
    });
}

现在没有种族。

完成后,拨打b,当b结束时,拨打c。

这可能会变得非常难看,因此Promises等工具会将其变为:

async_1()
    .then(async_2())
    .then(c);

如果你需要传递数据(而不仅仅是等待每一个被完成),它可能不是 干净的......,但承诺是非常的这种工作有力。