试图理解一种简单的nodejs异步方式来处理i/o,并以下面的简单代码片段为例,这给我留下了疑问。
// Just to simulate an io (webservice call).
var performRiskCheckViaWebservice = function(personPassportNumber, callback) {
console.log("Risk check called for personPassportNumber: "+personPassportNumber);
setTimeout(callback(personPassportNumber, "OK"), 5000);
}
function assessRisk(passportNumber) {
performRiskCheckViaWebservice(passportNumber, function(passportNumber, status){
console.log("Risk status of "+passportNumber+" is: "+status);
})
}
assessRisk("1");
assessRisk("2");
assessRisk("3");在上面的简单代码片段中,我希望看到:
Risk check called for personPassportNumber: 1
Risk check called for personPassportNumber: 2
Risk check called for personPassportNumber: 3
And 5 seconds later:
Risk status of 1 is: OK
Risk status of 2 is: OK
Risk status of 3 is: OK但实际输出是:
Risk check called for personPassportNumber: 1
Risk status of 1 is: OK
Risk check called for personPassportNumber: 2
Risk status of 2 is: OK
Risk check called for personPassportNumber: 3
Risk status of 3 is: OK5秒后,程序停止。
我的理解有什么问题吗?
发布于 2015-06-04 00:15:18
结果,我不得不在setTimeout(...)中用一个匿名函数包装回调函数。以下是工作版本:
// Just to simulate an io (webservice call).
var performRiskCheckViaWebservice = function(personPassportNumber, callback) {
console.log("Risk check called for personPassportNumber: "+personPassportNumber);
setTimeout(function() {
callback(personPassportNumber, "OK")
}, 5000);
}
function assessRisk(passportNumber) {
performRiskCheckViaWebservice(passportNumber, function(personPassportNumber, status){
console.log("Risk status of "+personPassportNumber+" is: "+status);
})
}
assessRisk("1");
assessRisk("2");
assessRisk("3");发布于 2015-06-04 00:20:24
以下是代码的同步瀑布:
sync assessRisk
sync performRiskCheckViaWebservice
sync console.log Risk.check
sync callback <== problem here
sync console.log Risk status
sync setTimeout 5000所以你观察到的是正常的。
你可以替换
setTimeout(callback(personPassportNumber, "OK"), 5000);通过
setTimeout(callback.bind(null, personPassportNumber, "OK"), 5000); https://stackoverflow.com/questions/30625226
复制相似问题