Nodejs没有执行asynchronous的promise函数

我写了一个小例子js来学习如何使用Promises。 我预计脚本开始,并立即输出“开始”和几秒钟后“45”。 但是,无论如何,脚本开始时没有任何输出,在退出之前,两行都被打印出来。 我误解了承诺如何工作或有缓冲的问题?

;(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

在承诺中包装代码不会使其asynchronous执行。 它使得使用asynchronous代码更容易。

在你的例子中,你的循环同步执行。 这里是你使用setTimeout的例子,它是asynchronous执行的,而不是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 

是的,你有一个小小的误解。 在创build时,Promise可以完成或开始在同一个事件循环中进行工作,这就是您的示例所做的工作。 然后他们最终产生事件循环,并且保证它们的结果不会在开始滴答时解决也不会拒绝,总是在之后。

由于典型的承诺是用于asynchronousIO的,因此通常不会注意用同一个勾号准备工作的时间。 例如,构build一个SQL查询,然后将其发送到数据库,并在完成时解决该承诺。 但是,在极端情况下,如果通过同步string操作来构build庞大而复杂的SQL查询,则会占用最初的滴答,直到最终通过networking将其发送到数据库,然后代码将进行额外的滴答最终当数据库响应到达时,这个承诺就会解决。