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

Wil*_*een 9 javascript asynchronous callback node.js 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');
Run Code Online (Sandbox Code Playgroud)

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

Promise.resolve()异步的?或者是 .then异步还是两种功能?引擎盖下是否还有其他一些机制?

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

Jon*_*lms 8

 Promise.resolve([1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)

Promise.resolve()是异步的吗?

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

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

不,两者在某种意义上都不是异步的

promise1.then((value) => console.log(value));
Run Code Online (Sandbox Code Playgroud)

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

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

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

是的,后台有一个"魔术" 事件循环,用于管理所有异步事件.

  • 解析和调用回调是两件不同的事情。我认为在 `Promise.resolve([1, 2, 3])` 中,promise 是同步实现的(已解决)。即使在 promise executor 中调用 `resolve` 函数也是同步的,它会立即更改 promise 状态。 (2认同)

Ber*_*rgi 5

但在什么执行点它会变成异步呢?

当事情发生“不正常”时。

Promise.resolve()异步的吗?

通常不会。但是,是的,取决于你用它来称呼它的论点,有时确实会安排稍后对thenable进行同化。在您的情况下,传递一个数组,不,没有任何异步发生。

无论如何,它总是立即返回一个承诺。

或者是.then异步甚至两者都有功能?

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

当然,它也总是立即返回一个承诺。

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

当询问一个函数是否异步时,不幸的是,我们的意思是异步调用该函数(稍后),还是导致另一个函数被异步调用(通过调度异步事件),这是不明确的。


小智 5

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

  1. 等待评估完成。
  2. 用最终值解决。
  3. 以“原因”值拒绝。

首先,promise1分配了一个最终值为 [1,2,3] 的处于“已解决”状态的承诺:

var promise1 = Promise.resolve([1, 2, 3]);
Run Code Online (Sandbox Code Playgroud)

接下来,我们要求,一旦promise1进入它的已解决状态,我们就记录它的最终值。 然而,promise 中的 .then()、.catch() 等永远不会被评估,直到整个程序通过并且执行进入 Javascript 事件循环。 因此,这块代码注册了将要完成但实际上并未完成的未来动作;这段代码会立即返回,而不会发生完成。

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

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

console.log('end of script');
Run Code Online (Sandbox Code Playgroud)

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

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


Red*_*edu 5

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

因此,对于以下代码,请在运行之前尝试猜测日志的顺序。

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")
Run Code Online (Sandbox Code Playgroud)

因此,如您所见,Promises使用的微任务队列具有事件队列的特权,并且当时间到时,即使它们都解决了,微任务队列开头的指令也比事件队列开头的不良指令优先。同时就像上面一样。