使用异步node.js函数控制流和错误处理

环境主义者

我有一个函数,其中许多小进程独立发生,但是所有这些进程的结果都必须进入最终的回调中。这不是一个非常不合理的情况。这种代码不一定会提前知道运行的时间,时间和时间,这很常见,但是在此之前的几个小时,我无法弄清楚这样做的巧妙方法。我不是要花几个小时的代码时间,而只是简单地解释如何做到这一点。

wrapper下面函数以异步方式完成了一系列任务,即在执行之前尚不清楚确切的运行时间,运行时间和运行次数。我试图找到一种简洁的方法来调用final callback所有回调(注释),前提是它们没有首先失败,但是一旦失败就立即退出包装函数。这种情况的一个例子是下面例子

// Definition for wrapper function
function wrapper(callback) {
    asyncfunction1();
    for(/*conditions*/) {
        asyncfunction2();
    }
    asyncfunction3(function(results) {
        asyncfunction4(results);
        for(res in results) {
            asyncfunction5(res);
        }
    });
}

// Call to wrapper function
wrapper(function(err) {                // final callback
    if (err) console.log("Failure");
    else console.log("Success");
});

wrapper拥有一系列的功能(asyncfunction#()),它都必须成功地完成了回调被称为callback(false)如果任何一个失败,则调用回调,然后在那里callback(true)退出,整个包装器退出,而不关闭进程。

我的绊脚石:

  • 有没有一种方法可以使用内置事件从包装函数退出时调用回调?
  • 有没有一种本机的方法可以从包装函数的深处退出包装函数,而又不破坏整个过程呢?
黏土

我还建议您使用async.js,这样您就会有一些嵌套调用。异步是针对这种类型的事情-NodeJS中的控制流非常棘手。还有其他软件包(承诺,其他异步软件包等)。

下面是使用异步的示例。请注意,如果您的流程可以并行运行,则外部.series方法可能是.parallel我喜欢在外部传递所有可传递resultsObj给每个异步调用的东西。它可以保存数组,值,对象等。只是一个持有人。

我还使用一种.series表示形式,其中传入了命名函数的对象,而不是函数数组。存储传递给回调的值,这在asyncFunction4中已使用。

var resultsObj = {};
async.series( {
  asyncFunction1: function( seriesCb ) {
    //do stuff
    seriesCb();
  },
  asyncFunction2: function( seriesCb ) {
    async.each( yourArray2, function( item, eachCb ) {
      //do stuff
      eachCb();
    }, function( errEach ) {
      resultsObj.someFlag = true;
      seriesCb( errEach );
    } );
  },
  asyncFunction3: function( seriesCb ) {
    callAsyncFunction3( function( results3 ) {
      async.series( {
        asyncFunction4: function( innerSeriesCb ) {
          var results4 = "yes";
          innerSeriesCb( results4 );
        },
        asyncFunction5: function( innerSeriesCb ) {
          async.each( yourArray5, function( item, eachCb ) {
            //do stuff
            eachCb();
          }, function( errEach ) {
            innerSeriesCb( errEach );
          } );
        }
      }, function( innerSeriesErr, innerSeriesResults ) {
        console.log("Result value of async4 was " + innerSeriesResults.asyncFunction4 );
        seriesCb( innerSeriesErr, innerSeriesResults );
      } );
    } );
  }
}, function( seriesErr, seriesResults ) {
  if ( seriesErr ) console.log( "Failure" );
  else console.log( "Success.  results=" + JSON.stringify( resultsObj ) );
} );

编辑:还有一件事。您会注意到该控件框架已经很大。那是没有代码的。分解您的方法,让它们接受(并使用)典型的NodeJScallback(err)callback(err, results)样式。然后在您的异步流中,以较短的方式调用它们。它将使这个较大的控制文件更易于管理。

function doSomething( input1, input2, callback ){
  if( input1 === input2 ) return callback( new Error("Cannot be equal") );
  callback( null, "Success ");
}

async.series( {
  asyncFunction1: function( seriesCb ) {
    doSomething( 1, 2, seriesCb );
  }
}, function( seriesErr, seriesResults ) {
  if ( seriesErr ) console.log( "Failure" );
  else console.log( "Success" );
} );

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

使用node.js流进行错误处理

来自分类Dev

在node.js中使用异步瀑布

来自分类Dev

使用累加器遍历Node.js异步目录

来自分类Dev

Node.JS-使用异步功能处理传入的请求

来自分类Dev

异步函数中的回调和错误处理

来自分类Dev

使用异步作业在node.js / express中正常关闭

来自分类Dev

Node.js:如何使用异步模块执行无限循环

来自分类Dev

使用forEach时,与node.js异步流混淆。

来自分类Dev

使用循环在Node.js中进行异步作业调度

来自分类Dev

使用Node.js从异步函数返回列表

来自分类Dev

使用异步Node.JS来服务HTTP请求

来自分类Dev

Node.js:您可以在流中使用异步函数吗?

来自分类Dev

使用Node.js异步请求在Redis中进行循环

来自分类Dev

在node.js中使用异步模块

来自分类Dev

Ajax成功和错误处理程序无法与Node.js一起使用

来自分类Dev

如何使用Express和Node进行异步调用

来自分类Dev

用于错误处理的异步处理的函数签名

来自分类Dev

express.js中嵌套异步函数中的错误处理

来自分类Dev

如何使用C#完成Node.js的异步性?

来自分类Dev

如何抓取使用node.js异步加载数据的网站?

来自分类Dev

如何在Node.js中使用异步映射系列?

来自分类Dev

在Node.js / Express中使用异步Postgres的正确方法?

来自分类Dev

Node.js-使用多个查询异步构建JSON

来自分类Dev

使用累加器遍历Node.js异步目录

来自分类Dev

Node.JS-使用异步功能处理传入的请求

来自分类Dev

使用async.forEach和异步操作的Node.js

来自分类Dev

在node.js中使用异步模块

来自分类Dev

在Node.js中使用异步瀑布进行函数迭代

来自分类Dev

使用Node.js和Java异步获取MQTT数据

Related 相关文章

热门标签

归档