Promise.resolve是一个异步函数吗?

时间:2018-02-11 15:19:40

标签: javascript node.js asynchronous callback promise

当我有以下代码时:

var promise1 = Promise.resolve([1, 2, 3]);

promise1.then((value) => {
  console.log(value);
  // expected output: Array [1, 2, 3]
});


console.log('end of script');

我知道脚本的结尾是早先返回的,因为promise是异步的。但是在执行的哪个阶段它变得异步?

Promise.resolve()是否异步? 或.then是异步的还是两个函数? 引擎盖下还有其他一些机制吗?

(因为我只获得了新async await功能的结果,所以谷歌是一个地狱)

4 个答案:

答案 0 :(得分:6)

 Promise.resolve([1, 2, 3]);
  

Promise.resolve()是异步的吗?

不,这只是一个常规的函数调用。它将返回 immeadiately 的结果。

  

或者是.then是异步的,甚至是两个函数

没有。

意义上的两者都不是异步的
promise1.then((value) => console.log(value));

immeadiately 返回一个新的链接承诺。

然而,Promise definetly 异步解析 ,这意味着在执行整个同步代码后,内部函数(value => console.log(value))将被确定地调用。

  

引擎盖下是否还有其他机制?

是的,有一个"魔法" 事件循环在后台管理所有异步事件。

答案 1 :(得分:4)

所有答案都很好,但我想在这里提一点微妙的观点。在JS中,并非所有异步动物都是平等的。 Promises使用微任务队列,而oldschool异步回调使用事件队列。

以下代码请在运行之前尝试猜测日志的顺序..

console.log("Code starts here");
setTimeout(console.log,0,"setTimeout resolved");
Promise.resolve("promise resolved")
       .then(s => (console.log(s), "yet another promise resolved"))
       .then(s => console.log(s));
console.log("Code ends here")

因此,当您看到Promises使用的微任务队列对事件队列具有特权时,当时间到来时,微任务队列头部的指令优先于事件队列头部的指令,即使他们都像上面一样同时解决。

答案 2 :(得分:3)

以下是发生的事情的确切顺序。在开始之前,您应该注意Promise对象始终处于以下三种状态之一:

  1. 等待评估完成。
  2. 已解决最终值。
  3. 拒绝了#34;原因"值。
  4. 首先,promise1被分配了一个承诺,该承诺位于"已解决"最终值为[1,2,3]的州:

    var promise1 = Promise.resolve([1, 2, 3]);
    

    接下来,我们要求,一旦promise1进入解析状态,我们就会记录其最终值。 然而,在整个程序通过并执行进入Javascript事件循环之前,承诺中的.then(),。catch()等永远不会被评估。因此,这段代码注册将要完成但未实际完成的未来行动;这段代码立即返回而没有完成。

    promise1.then((value) => {
      console.log(value);
      // expected output: Array [1, 2, 3]
    });
    

    之后,我们打印一些文字:

    console.log('end of script');
    

    此时,Javascript的执行返回到其事件循环,它找到我们之前注册的.then(),并执行相关的功能((value) => console.log(value))。

    有一篇有用的文章描述了事件循环如何与promises一起使用:https://blog.sessionstack.com/how-javascript-works-event-loop-and-the-rise-of-async-programming-5-ways-to-better-coding-with-2f077c4438b5

答案 3 :(得分:2)

  

但是在执行的哪个阶段变得异步?

当某些事情发生“乱序”时。

  

Promise.resolve()是否异步?

通常不会。但是,是的,取决于你用它调用它的参数,它有时会安排一个可能的同化物以供日后使用。在你的情况下,传递一个数组,没有任何异步进行。

在任何情况下,它总是立即返回一个承诺。

  

.then是异步还是两种功能?

是。 then 总是安排您稍后传入的回调函数。

当然,它也会立即回复承诺。

一般来说,我们可以说观察一个promise结果总是异步的。

当询问函数是否是异步时,遗憾的是我们是否意味着函数是异步调用(稍后),或者导致异步调用另一个函数(通过安排异步事件。)