有人能解释一下为什么下面的代码打印"arg1 0",而我希望它打印"arg1 hi"吗。这是由于词汇范围吗?
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) {
}
);
}
瀑布只是一个函数
这里没有任何魔法
Javascript中的任何函数在调用之前都必须评估其参数。
因此,async.apply(localScoped, myValue)
在async.waterfall
之前求值,并关闭旧myValue的值(0);
你可以通过瀑布:
function (myCallback) {
myValue = clientCode;
myCallback(null , myValue);
},
async.apply(localScoped);
或者编写一个包装函数,比如:
function(next) {
localScoped(myValue, next);
}
尝试以下解决方案:
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) {
}
);
}
瀑布的工作原理:。
运行异步任务列表,将每个任务的结果传递给下一个任务。
依次运行一个函数数组,每个函数将结果传递给数组中的下一个。但是,如果任何函数将错误传递给回调,则不会执行下一个函数,并且会立即调用带有错误的主回调。
有关更多详细信息,请查看:https://www.npmjs.com/package/async-waterfall