我写了一个小例子来学习如何使用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
答案 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查询要通过同步字符串操作来构建,那么它将占用最初的滴答,直到它最终通过网络发送到数据库,然后代码将继续进行额外的滴答,并且最终,当响应从数据库到达时,承诺将会解决。