Nodejs 没有异步执行 promise 函数

Nodejs did not execute a promise function asynchronous

本文关键字:promise 函数 执行 异步 Nodejs      更新时间:2023-09-26

我写了一个小例子js来学习如何使用Promises。我预计脚本启动并立即输出"start",几秒钟后输出"45"。但是 insead ,脚本在没有任何输出的情况下开始,在退出之前,两行都被打印出来。我是否误解了承诺的工作方式或是否存在缓冲问题?

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

$ 节点 -v0.12.6 版

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

在您的示例中,循环同步执行。下面是使用 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

是的,你有一个轻微的误解。承诺可以在创建时对同一事件循环时钟周期执行或开始工作,这就是示例所做的。然后它们最终产生事件循环,并且它们的结果保证在起始报价时不会解析或拒绝,总是在之后。

由于 promise 通常用于异步 IO,因此您通常不会注意到在同一刻度中准备工作所花费的时间。例如,构造一个 SQL 查询,然后将其发送到数据库,完成后,解析承诺。但是,在极端情况下,如果你有一个巨大而复杂的SQL查询要通过同步字符串操作构建,它将占用初始时钟周期,直到它最终通过网络发送到数据库,然后代码将继续使用其他时钟周期,最终当响应从数据库到达时,承诺将解析。