返回已解决的 Promise 时的时间差异
Difference in timing when returning a resolved Promise
我有一个函数可以完成大量工作,然后 returns 一个已解决的 Promise。每个问题解决的时间有区别吗?
选项 1
function returnPromise() {
// do a bunch of stuff
return Promise.resolve();
}
这样:
选项 2
function returnPromise() {
return new Promise((resolve, reject) => {
//do a bunch of stuff
resolve();
});
}
方案1是不是全部完成后释放控制,方案2是函数一调用就释放控制?我觉得这源于我不完全理解事件循环这一事实。在此先感谢您帮助我理解这一点。
Is there a difference with doing it this way?
不,您的两个示例做的事情完全相同。
Promise.resolve
和 Promise.reject
只是 Promise Class 上的静态方法,可帮助您避免在不需要时构建整个 Promise
。
Is there a difference in the timing when each will be resolved?
没有区别。 Promise 执行器(您传递给 new Promise()
的回调)被立即同步调用。因此,在这两种情况下,您都立即同步 return 一个已经解决的承诺,并且您函数中的所有代码都已经执行。
执行时间上应该没有有意义的差异。当然,执行的 CPU 周期数可能略有不同,但两者都有完全相同的结果,并且都立即 return 一个已经解决的承诺,因此调用代码应该没有区别根本。
Promise.resolve()
只是作为一种更紧凑(并且可能更有效)的方式来创建已解决的承诺。
Does Option 1 release control after all the work is done, and Option 2 release control as soon as the function is called?
他们都 return 当你完成所有工作时,他们 return 一个已经解决的承诺。这是因为 new Promise()
的执行器回调是同步调用的(在您的函数 returns 之前)。
I feel like this has root in the fact I don't fully understand the event loop. Thanks in advance for helping me understand this.
在这种特殊情况下,您的所有代码都是 运行 同步的,因此没有特别涉及事件循环。 returnPromise()
函数 returns (在这两种情况下)当函数中的代码同步执行时。这里没有异步代码。
当您对 returned promise 执行 .then()
时会涉及事件循环,因为即使 promise(在这两种情况下)已经解决,.then()
处理程序也会排队在事件队列中,并且 运行 直到 Javascript 的其余部分在 .then()
处理程序完成执行后才开始。
console.log("1");
returnPromise().then(function() {
console.log("2");
});
console.log("3");
这将生成相同的输出结果:
1
3
2
使用两个版本的 returnPromise()
函数,因为 .then()
处理程序排队等待事件循环的下一个滴答声(例如,在当前 Javascript 执行线程的其余部分是完成)。
我有一个函数可以完成大量工作,然后 returns 一个已解决的 Promise。每个问题解决的时间有区别吗?
选项 1
function returnPromise() {
// do a bunch of stuff
return Promise.resolve();
}
这样:
选项 2
function returnPromise() {
return new Promise((resolve, reject) => {
//do a bunch of stuff
resolve();
});
}
方案1是不是全部完成后释放控制,方案2是函数一调用就释放控制?我觉得这源于我不完全理解事件循环这一事实。在此先感谢您帮助我理解这一点。
Is there a difference with doing it this way?
不,您的两个示例做的事情完全相同。
Promise.resolve
和 Promise.reject
只是 Promise Class 上的静态方法,可帮助您避免在不需要时构建整个 Promise
。
Is there a difference in the timing when each will be resolved?
没有区别。 Promise 执行器(您传递给 new Promise()
的回调)被立即同步调用。因此,在这两种情况下,您都立即同步 return 一个已经解决的承诺,并且您函数中的所有代码都已经执行。
执行时间上应该没有有意义的差异。当然,执行的 CPU 周期数可能略有不同,但两者都有完全相同的结果,并且都立即 return 一个已经解决的承诺,因此调用代码应该没有区别根本。
Promise.resolve()
只是作为一种更紧凑(并且可能更有效)的方式来创建已解决的承诺。
Does Option 1 release control after all the work is done, and Option 2 release control as soon as the function is called?
他们都 return 当你完成所有工作时,他们 return 一个已经解决的承诺。这是因为 new Promise()
的执行器回调是同步调用的(在您的函数 returns 之前)。
I feel like this has root in the fact I don't fully understand the event loop. Thanks in advance for helping me understand this.
在这种特殊情况下,您的所有代码都是 运行 同步的,因此没有特别涉及事件循环。 returnPromise()
函数 returns (在这两种情况下)当函数中的代码同步执行时。这里没有异步代码。
当您对 returned promise 执行 .then()
时会涉及事件循环,因为即使 promise(在这两种情况下)已经解决,.then()
处理程序也会排队在事件队列中,并且 运行 直到 Javascript 的其余部分在 .then()
处理程序完成执行后才开始。
console.log("1");
returnPromise().then(function() {
console.log("2");
});
console.log("3");
这将生成相同的输出结果:
1
3
2
使用两个版本的 returnPromise()
函数,因为 .then()
处理程序排队等待事件循环的下一个滴答声(例如,在当前 Javascript 执行线程的其余部分是完成)。