Nodejs asyn.apply和Javascript应用

有人可以请解释我为什么下面的代码打印“arg1 0”,而我期望它打印“arg1嗨”。 这是由于词汇范围?

runIt(); function localScoped(arg1, callback) { console.log('arg1', arg1); callback(); } function runIt() { var myValue = 0; async.eachLimit(["hi"], 1, function launchOneVar(clientCode, doneLaunchOneVar) { async.waterfall([ function (myCallback) { myValue = clientCode; myCallback(); }, async.apply(localScoped, myValue) ], function (err, result) { console.log(myValue); doneLaunchOneVar(null, result); }); }, function finishing(err) { } ); } 

瀑布只是一个function。
这里没有任何魔法。
Javascript中的任何函数都必须在调用之前评估其参数。

所以, async.apply(localScoped, myValue)async.waterfall之前async.waterfall并closures旧的myValue的值(0)。

你可以通过瀑布:

 function (myCallback) { myValue = clientCode; myCallback(null , myValue); }, async.apply(localScoped); 

或者写一个包装函数,如:

 function(next) { localScoped(myValue, next); } 

尝试以下解决scheme

 runIt(); function localScoped(arg1, callback) { console.log('arg1', arg1); callback(); } function runIt() { var myValue = 0; async.eachLimit(["hi"], 1, function launchOneVar(clientCode, doneLaunchOneVar) { //console.log(clientCode); async.waterfall([ function (myCallback) { myValue = clientCode; myCallback(null , myValue); }, async.apply(localScoped) ], function (err, result) { console.log('last - '+myValue); doneLaunchOneVar(null, result); }); }, function finishing(err) { } ); } 

水stream如何工作:

运行asynchronous任务列表,将每个任务的结果传递给下一个任务。

运行一系列函数,每个函数都将结果传递给数组中的下一个。 但是,如果任何函数将错误传递给callback,则不会执行下一个函数,并立即调用主callback并返回错误。

有关更多详细信息, 请参阅 : https : //www.npmjs.com/package/async-waterfall

Interesting Posts