我有一个函数可以执行大量工作,然后返回已解析的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在调用函数后立即释放控制?我觉得这是因为我不能完全理解事件循环。在此先感谢您帮助我理解这一点。
答案 0 :(得分:2)
这样做会有区别吗?
不,你的两个例子完全一样。
Promise.resolve
和Promise.reject
只是Promise Class上的静态方法,可以帮助您避免在不需要时构建整个Promise
。
答案 1 :(得分:2)
解决每个问题的时间是否存在差异?
没有区别。 Promise执行程序(传递给new Promise()
的回调)立即和同步调用。因此,在两种情况下,您立即并同步返回已经解决的承诺,并且您的函数中的所有代码都已执行。
执行时间应该没有任何有意义的差异。当然,可能需要稍微不同的CPU周期来执行,但两者都具有完全相同的结果,并且都立即返回已经解决的promise,因此根本不应该对调用代码产生任何差异。
Promise.resolve()
只是意味着创建已经解决的承诺的更紧凑(可能更有效)的方法。
选项1是否在所有工作完成后释放控制权,而选项2在调用函数后立即释放控制权?
他们都会在你完成所有工作后返回并返回已经解决的承诺。这是因为同步调用new Promise()
的执行程序回调(在函数返回之前)。
我觉得这有根本事实我不完全理解事件循环。在此先感谢您帮助我理解这一点。
在这种特殊情况下,所有代码都是同步运行的,因此事件循环没有特别的参与。当函数中的代码同步执行时,returnPromise()
函数返回(在两种情况下)。这里没有异步代码。
当你对返回的promise做.then()
时会涉及事件循环,因为即使promise(在两种情况下)都已经解析,.then()
处理程序也会在事件队列中排队而不是在.then()
处理程序执行完毕后运行到Javascript的其余部分。
console.log("1");
returnPromise().then(function() {
console.log("2");
});
console.log("3");
这将生成相同的输出结果:
1
3
2
使用returnPromise()
函数的两个版本,因为.then()
处理程序排队等到事件循环的下一个滴答(例如,在完成当前Javascript执行的其余部分之后)。