Promise在nodejs中是同步还是异步

Promise is synchronous or asynchronous in node js

我对承诺有很多困惑。它是同步的还是异步的?

return new Promise (function(resolved,reject){
    //sync or async? 
});

您传递 Promise 构造函数的函数同步运行,但任何依赖于其解析的内容都将被异步调用。即使承诺立即解决,任何处理程序都将异步执行(类似于您 setTimeout(fn, 0) 时)- 主线程首先运行到结束。

无论您的 Javascript 环境如何 - 无论您使用的是 Node 还是浏览器,都是如此。

console.log('start');
const myProm = new Promise(function(resolve, reject) {
  console.log('running');
  resolve();
});
myProm.then(() => console.log('resolved'));
console.log('end of main block');

Promise 本身并不完全同步或异步。当你创建一个承诺时,你传递给它的回调会立即执行,并且在该函数产生之前没有其他代码可以 运行 。考虑以下示例:

new Promise(function(resolve, reject) {
  console.log('foo');
})
console.log('bar');

promise 外的代码必须等待 promise 内的代码(同步)完成才能开始执行。

也就是说,promises 是处理异步代码的常用方法。 promise 最常见的用例是表示以异步方式生成或获取的某些值。通过使用 .then() 或相关的 Promise 方法注册回调,依赖于该值的逻辑可以异步等待直到该值可用。

当您创建承诺并将回调传回给它时 该回调将立即执行(同步)

const promise= new Promise(function(resolve, reject) {
      //doing some logic it gonna be executed synchronously
       console.log("result");
    })
    console.log("global log")
    

但是当你通过 .then() 方法解决它时,它会以异步方式运行 例如:

const promise = new Promise(function(resolve, reject) {
  //doing some logic it gonna be executed synchronously

  resolve("fullfiled")
})
promise.then(v => {
  console.log(v)
})
console.log("global log")

Promise 与 Javascript 中的 class 一样。假设您正在创建自己的 Promise 实现,您的 promise class 大致如下所示。请注意,在您的构造函数中,您期望传递一个方法,您立即调用传递 resolve and reject 作为参数。

class Promise {
    constructor(method) {
        method(resolve, reject)
    }

    resolve() { ... }

    reject() { ... }

    then() { ... }
}

所以当您执行 new Promise() 时,您只是在创建一个新对象。您的 Promise constructor 将 运行,它会立即调用该方法。这就是为什么你的 promise 中的代码会同步执行的原因。

return new Promise (function(resolved,reject){
    //sync or async? 
});

如果在您的函数中调用另一个本质上是异步的函数,那么另一个函数将异步执行,否则,其他所有内容都会同步执行。

如果您使用 then 在 promise 中创建链,那么它只会在您的第一个 promise 调用 resolve() 后才会被调用。

return new Promise (function(resolve,reject){
  const a = 5*5; // sync operation.
  db.save(a, function callback() { // async operation.
    resolve() // tells promise to execute `then` block.
  });
});

这段代码更清楚:

        console.log("0");
        new Promise((resolve, reject) => {
          console.log("1");
          resolve();
        }).then(() => {
          console.log("2");
        });
        console.log("3");

代码打印: 0 1 3 2 因此,then 异步运行,而主回调函数同步运行。

const promise = new Promise(function(resolve, reject) {
  //doing some logic it gonna be executed synchronously
 console.log("check")
  resolve("fullfiled")
})
promise.then(v => {
  console.log(v)
})
console.log("global log")

我发现其他答案都不准确。

new Promise (executor_function)
这里的

executor_function会运行立即作为Promise初始化的一部分---这意味着Promise init会同步执行,但并不意味着executor_function里面的代码一定会运行是同步的,相反,executor_function里面的代码也可以是运行异步的,例如:

new Promise ((resolve, reject) => {
    setTimeout(resolve, 1000); // wait 1s 
})