JavaScript承诺:如何在调用堆栈和任务队列中实现承诺?

时间:2020-06-13 17:30:58

标签: javascript asynchronous es6-promise synchronous

我读了很多关于诺言的文章。我知道,promise是任务队列的微任务,异步代码执行是任务。在异步代码工作同步代码后的承诺中如何发生(即在经过某些提取之后,我们可以在then块中编写同步代码,我猜然后代码块中的所有代码都是异步的,即使它例如禁止了console.log)?

1 个答案:

答案 0 :(得分:1)

根据promise规范,即使当前的promise已经解决,也总是在完成当前执行线程之后异步调用.then().catch()处理程序。这只是promise实现的一部分,以确保实现这一目标。

因此,即使在已解决承诺的此示例中,您也会在控制台中看到:

A
C
B

console.log("A");
Promise.resolve().then(() => {
    console.log("B");
});
console.log("C");

在保证异步代码工作同步代码之后,如何做到这一点(例如,在获取某些内容后,我们可以在then块中编写同步代码,我猜然后代码块中的所有代码都是异步的,即使它禁止了console.log,例如) ?它与异步编程的原理相矛盾。

您可以将所需的任何代码放入.then()块中。它可以是异步代码或同步代码。这只是代码。在将来.then()处理程序被调用时,代码将在将来的某个时刻运行。类似于如何将所需的任何代码放入setTimeout()回调中。计时器控制代码何时开始运行,但对代码没有其他控制。