返回已解决的Promise时的时间差异

时间:2017-09-27 20:22:06

标签: javascript promise event-loop

我有一个函数可以执行大量工作,然后返回已解析的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在调用函数后立即释放控制?我觉得这是因为我不能完全理解事件循环。在此先感谢您帮助我理解这一点。

2 个答案:

答案 0 :(得分:2)

  

这样做会有区别吗?

不,你的两个例子完全一样。

Promise.resolvePromise.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执行的其余部分之后)。