Nodejs asyn.apply 和 Javascript 申请
Nodejs asyn.apply and Javascript Apply
有人能解释一下为什么下面的代码打印 "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) {
}
);
}
尝试以下解决方案:
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) {
}
);
}
瀑布的工作原理: .
运行一系列异步任务,将每个任务的结果传递给下一个任务。
连续运行一组函数,每个函数将其结果传递给数组中的下一个。但是,如果任何函数将错误传递给回调,则不会执行下一个函数并立即调用主回调并返回错误。
瀑布只是一个函数。
这里没有任何魔法。
Javascript 中的任何函数都必须在调用前评估其参数。
因此,async.apply(localScoped, myValue)
在 async.waterfall
之前求值并关闭旧 myValue 的值 (0);
你可以通过瀑布:
function (myCallback) {
myValue = clientCode;
myCallback(null , myValue);
},
async.apply(localScoped);
或者写一个包装函数,比如:
function(next) {
localScoped(myValue, next);
}
有人能解释一下为什么下面的代码打印 "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) {
}
);
}
尝试以下解决方案:
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) {
}
);
}
瀑布的工作原理: .
运行一系列异步任务,将每个任务的结果传递给下一个任务。
连续运行一组函数,每个函数将其结果传递给数组中的下一个。但是,如果任何函数将错误传递给回调,则不会执行下一个函数并立即调用主回调并返回错误。
瀑布只是一个函数。
这里没有任何魔法。
Javascript 中的任何函数都必须在调用前评估其参数。
因此,async.apply(localScoped, myValue)
在 async.waterfall
之前求值并关闭旧 myValue 的值 (0);
你可以通过瀑布:
function (myCallback) {
myValue = clientCode;
myCallback(null , myValue);
},
async.apply(localScoped);
或者写一个包装函数,比如:
function(next) {
localScoped(myValue, next);
}