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