为什么 javascript ES6 Promises 在 resolve 之后继续执行?
Why does javascript ES6 Promises continue execution after a resolve?
据我所知,promise 是可以 resolve() 或 reject() 的东西,但我惊讶地发现 promise 中的代码在调用 resolve 或 reject 后继续执行。
我认为 resolve or reject 是 exit 或 return 的异步友好版本,这将停止所有即时函数执行。
有人可以解释为什么以下示例有时会在 resolve 调用后显示 console.log 背后的想法:
var call = function() {
return new Promise(function(resolve, reject) {
resolve();
console.log("Doing more stuff, should not be visible after a resolve!");
});
};
call().then(function() {
console.log("resolved");
});
当您 resolve
一个 promise 时将被调用的回调仍然被规范要求异步调用。这是为了确保在对同步和异步操作混合使用承诺时保持一致的行为。
因此,当您调用 resolve
时,回调会排队,并且函数会立即继续执行 resolve()
调用之后的任何代码。
只有在 JS 事件循环重新获得控制权后,回调才能从队列中移除并实际调用。
JavaScript有"run to completion"的概念。除非抛出错误,否则函数将一直执行到 return
语句或其末尾。函数之外的其他代码不能干扰它(除非再次抛出错误)。
如果你想resolve()
退出你的初始化函数,你必须在它前面加上return
:
return new Promise(function(resolve, reject) {
return resolve();
console.log("Not doing more stuff after a return statement");
});
resolve()
函数完全不像 return
。它只是表明用 then()
方法注册的回调函数的参数现在准备好了,回调函数可能会离开 Job 队列(或微任务队列)并进入主 JS 调用堆栈,但是仅当所有同步代码和在此代码完成之前进入队列的异步代码 运行 时才会发生这种情况。 console.log("Not doing more stuff after a return statement");
你代码中的这条语句是同步代码,优先于异步代码。这就是它首先运行的原因
据我所知,promise 是可以 resolve() 或 reject() 的东西,但我惊讶地发现 promise 中的代码在调用 resolve 或 reject 后继续执行。
我认为 resolve or reject 是 exit 或 return 的异步友好版本,这将停止所有即时函数执行。
有人可以解释为什么以下示例有时会在 resolve 调用后显示 console.log 背后的想法:
var call = function() {
return new Promise(function(resolve, reject) {
resolve();
console.log("Doing more stuff, should not be visible after a resolve!");
});
};
call().then(function() {
console.log("resolved");
});
当您 resolve
一个 promise 时将被调用的回调仍然被规范要求异步调用。这是为了确保在对同步和异步操作混合使用承诺时保持一致的行为。
因此,当您调用 resolve
时,回调会排队,并且函数会立即继续执行 resolve()
调用之后的任何代码。
只有在 JS 事件循环重新获得控制权后,回调才能从队列中移除并实际调用。
JavaScript有"run to completion"的概念。除非抛出错误,否则函数将一直执行到 return
语句或其末尾。函数之外的其他代码不能干扰它(除非再次抛出错误)。
如果你想resolve()
退出你的初始化函数,你必须在它前面加上return
:
return new Promise(function(resolve, reject) {
return resolve();
console.log("Not doing more stuff after a return statement");
});
resolve()
函数完全不像 return
。它只是表明用 then()
方法注册的回调函数的参数现在准备好了,回调函数可能会离开 Job 队列(或微任务队列)并进入主 JS 调用堆栈,但是仅当所有同步代码和在此代码完成之前进入队列的异步代码 运行 时才会发生这种情况。 console.log("Not doing more stuff after a return statement");
你代码中的这条语句是同步代码,优先于异步代码。这就是它首先运行的原因