繁体   English   中英

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

[英]async.series execute callback before finish current

这是结构

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()并使我的应用程序崩溃。 此外,有时它可以工作。

你可以帮帮我吗?

谢谢!

您的代码看起来正确,但是如果您依赖第一个函数的结果,则可以尝试使用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();
   }
});

问题解决了!

我没有使用自己的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) ,它将跳过所有其他异步并执行回调。

代替:

[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);
    });
}

现在没有种族。

当a完成时,呼叫b;当b完成时,呼叫c。

这真的很难看,因此使用Promises类的工具将其转换为:

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

它可能不是真的干净的,如果你需要周围传递数据(而不是仅仅等待每一个被finiahed)又将)......但承诺是非常强大的这种工作的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM