Nodejs没有执行异步

时间:2016-02-20 17:51:19

标签: javascript node.js asynchronous promise

我写了一个小例子来学习如何使用Promises。我希望脚本启动并立即输出“start”,几秒钟后输出“45”。但是,在没有任何输出的情况下,脚本会启动,在退出之前,两行都会打印出来。我误解了Promises是如何工作的还是有缓冲问题?

;(function(main, undefined) {
        "use strict";

        main.test = function() {
                return new Promise(function(resolve, reject) {
                        for(var i = 0; i < 999999999; ++i);
                        resolve(45);
                });
        };

})(global);

global.test().then(function(r) {
        console.log(r);
});


console.log("start");

$ node -v v0.12.6

2 个答案:

答案 0 :(得分:6)

在promise中包装代码不会使其异步执行。它使得使用异步代码更容易。

在您的示例中,您的循环同步执行。以下是使用setTimeout的示例,它以异步方式执行,而不是for循环。

;(function(main, undefined) {
        "use strict";

        main.test = function() {
                return new Promise(function(resolve, reject) {
                        setTimeout(function() { resolve(45); }, 5000)
                        console.log(44);
                });
        };

})(global);

global.test().then(function(r) {
        console.log(r);
});


console.log("start");

在此示例中,输出将为:

start
44
45

答案 1 :(得分:0)

是的,你有一点误解。 Promise可以在创建它们时在相同的事件循环标记上执行或开始工作,这就是您的示例所做的事情。然后他们最终产生事件循环,并且保证他们的结果不会在起始刻度上解决或拒绝,总是在。之后。

由于通常承诺用于异步IO,因此您通常不会注意到在同一时间内准备工作所花费的时间。例如,构建一个SQL查询,然后将其发送到DB,完成后再解析promise。但是,在一个极端的情况下,如果你有一个巨大的,复杂的SQL查询要通过同步字符串操作来构建,那么它将占用最初的滴答,直到它最终通过网络发送到数据库,然后代码将继续进行额外的滴答,并且最终,当响应从数据库到达时,承诺将会解决。