是诺言.解决异步函数



当我有以下代码时:

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异步甚至两个功能?引擎盖下还有其他机制吗?

(对Google来说是一个地狱,因为我只得到新的async await功能的结果(

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

是Promise.resolve((异步?

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

或。然后是异步甚至两个函数

否。从某种意义上说,两者都不异步

promise1.then((value) => console.log(value));

will 立即返回链接的新承诺。

但是,Promise绝对 nesolves 异步,这意味着在执行整个同步代码之后,肯定会调用内部函数(value => console.log(value)(。

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

是的,有"魔术">事件循环在管理所有异步事件的背景中。

所有答案都不错,但我想在这里提到一些微妙的观点。在JS中,并非所有异步动物都是相等的。承诺使用Microtask队列,而OldSchool async回调使用事件队列。

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

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

,正如您看到的Microtask队列一样他们都像上面一样同时解决。

这是正在进行的确切顺序。在开始之前,您应该注意,承诺始终在三个状态之一中:

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

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

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

接下来,我们要求,一旦promise1进入其解决状态,我们就会记录其最终值。,但是,在整个程序通过并执行输入JavaScript事件循环。寄存器未来将要完成但实际上没有完成的行动;这片代码立即返回而没有完成。

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

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

console.log('end of script');

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

有一篇有用的文章,描述事件循环如何在此处与承诺一起工作:https://blog.sessionstack.com/how-javascript-works-works-works-event-loop-and-loop-and-the-rise-the-rise-of-ashasenc-programmming-5通道到零件编码 - with-2f077c4438b5

但是,在什么执行点会变得异步?

发生某种事情时"失败"。

Promise.resolve()是异步的吗?

通常不是。但是,是的,根据您称之为哪些论点的不同,有时会安排以后的同化。在您的情况下,通过一个数组,没有任何异步。

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

.then异步甚至两个功能?

是。 then dis 始终安排稍后传递的回调函数。

当然,它也总是立即回报诺言。

通常,我们可以说观察诺言结果始终是异步的。

询问函数是否异步时,不幸的是,我们是否表示该函数是否为称为异步(稍后(,或 cosuses 通过安排异步事件(。

最新更新