gpt4 book ai didi

javascript - 为什么我的函数在我的 Promise 回调之前执行?

转载 作者:行者123 更新时间:2023-12-03 02:19:44 28 4
gpt4 key购买 nike

为什么在我的 Promise 之后调用的函数会在 Promise 的回调之前执行?

我在 MDN 上读过这篇文章,但不明白

"Callbacks will never be called before the completion of the current run of the JavaScript event loop."

我认为这意味着如果我在 resolve()reject() 之后有任何其他语句,它们将在调用回调之前执行。不过,这似乎是一个不完整的理解。

function myFunction() {
return new Promise( function(resolve, reject) {

const err = false;

if(err) {
reject("Something went wrong!!!");
}
else {
resolve("All good");
}
});
}

myFunction().then(doSuccess).catch(doError);
doOther();

function doError(err) {
console.log(err);
}

function doSuccess() {
console.log('Success');
}

function doOther() {
console.log("My Other Function");
}

输出:

我的其他功能

成功

最佳答案

根据规范,promise .then().catch() 回调永远不会同步调用,而是在事件循环的 future 标记上调用。这意味着同步代码的其余部分始终在调用任何 .then() 处理程序之前运行。

因此,您的 doOther() 函数在调用 doSuccess()doError() 之前运行。

Promise 是以这种方式设计的,以便无论 Promise 是立即解决还是在将来某个时间解决,都将以一致的时间调用 Promise .then() 处理程序。如果允许同步 .then() 处理程序,那么调用代码要么必须知道它何时可能被同步调用,要么很容易受到奇怪的计时错误的影响。

Promises/A+ specification ES6 规范中的 Promise 是基于它的,它定义了一个 `.then() 处理程序,如下所示:

promise.then(onFulfilled, onRejected)

然后对此有这样的说法:

2.2.4. onFulfilled or onRejected must not be called until the execution context stack contains only platform code. [3.1].

然后它定义了这样的平台代码:

Here “platform code” means engine, environment, and promise implementation code. In practice, this requirement ensures that onFulfilled and onRejected execute asynchronously, after the event loop turn in which then is called, and with a fresh stack. This can be implemented with either a “macro-task” mechanism such as setTimeout or setImmediate, or with a “micro-task” mechanism such as MutationObserver or process.nextTick. Since the promise implementation is considered platform code, it may itself contain a task-scheduling queue or “trampoline” in which the handlers are called.

基本上,这意味着通过在事件循环中插入一个任务来调用 .then() 处理程序,该任务在当前运行的 Javascript 完成并将控制权返回给解释器之前不会执行(其中它可以检索下一个事件)。因此,安装 .then() 处理程序后拥有的任何同步 Javascript 代码将始终在调用 .then() 处理程序之前运行。

关于javascript - 为什么我的函数在我的 Promise 回调之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49214976/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com