首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeJS异步/非阻塞io basic

NodeJS异步/非阻塞io basic
EN

Stack Overflow用户
提问于 2015-06-04 00:04:07
回答 2查看 36关注 0票数 0

试图理解一种简单的nodejs异步方式来处理i/o,并以下面的简单代码片段为例,这给我留下了疑问。

代码语言:javascript
复制
    // 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");

在上面的简单代码片段中,我希望看到:

代码语言:javascript
复制
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

但实际输出是:

代码语言:javascript
复制
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: OK

5秒后,程序停止。

我的理解有什么问题吗?

EN

回答 2

Stack Overflow用户

发布于 2015-06-04 00:15:18

结果,我不得不在setTimeout(...)中用一个匿名函数包装回调函数。以下是工作版本:

代码语言:javascript
复制
    // 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");
票数 1
EN

Stack Overflow用户

发布于 2015-06-04 00:20:24

以下是代码的同步瀑布:

代码语言:javascript
复制
sync assessRisk
sync performRiskCheckViaWebservice
sync console.log Risk.check
sync callback <== problem here
sync console.log Risk status
sync setTimeout 5000

所以你观察到的是正常的。

你可以替换

代码语言:javascript
复制
setTimeout(callback(personPassportNumber, "OK"), 5000);

通过

代码语言:javascript
复制
setTimeout(callback.bind(null, personPassportNumber, "OK"), 5000); 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30625226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档