Promise在节点js中是同步的或异步的

时间:2018-04-19 01:28:01

标签: javascript node.js asynchronous promise synchronous

我承诺很多困惑。这是同步还是异步?

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

7 个答案:

答案 0 :(得分:9)

传递到 Promise构造函数的函数同步运行,但依赖于其解析的任何内容都将异步调用。即使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');




答案 1 :(得分:3)

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

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

promise之外的代码必须等待promise(同步)中的代码在开始执行之前完成。

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

答案 2 :(得分:0)

创建诺言并回电时 该回调将立即执行(同步)

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

答案 3 :(得分:0)

承诺就像Javascript中的普通类。假设您正在创建自己的Promise实现,则您的promise类将大致如下所示。请注意,在构造函数中,您希望传递一个方法,您将立即调用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获得了诺言,那么只有在您的第一个诺言调用了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.
  });
});

答案 4 :(得分:0)

此代码使其更清晰:

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

代码显示: 0 1 3 2 因此,then是异步运行的,而主回调函数是同步运行的。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我认为其他答案都不准确。

new Promise (executor_function)

这里的 executor_function 会作为 Promise 初始化的一部分立即运行 --- 这意味着 Promise init 将同步执行,但并不意味着 executor_function 内部的代码将同步运行,而是 executor_function 内部的代码将异步运行。

new Promise ((resolve, reject) => {
    .... // run asynchronously

})