返回值和从函数返回Promise.resolve()之间的区别

the*_*mer 5 javascript promise

我有理解当我们简单地返回一个值或Promise.resolve()从函数返回时会发生什么.具体来说:我试图理解promises链是如何工作的.我正在链接方法并验证值是否在最后一次调用的方法中到达then.我只是想了解返回承诺之间的差异then,返回Promise.resolve()then,并返回只是一个值then.

T.J*_*der 9

我有理解当我们简单地返回一个值或Promise.resolve()从函数返回时会发生什么.

所以(至少)有两种不同的场景:

在任何旧功能

如果它只是任何旧函数(不是thencatch回调),那么区别在于return value;直接返回值,而return Promise.resolve(value);返回使用该值解析的promise.它改变了调用代码使用结果的方式.在这种return value;情况下,调用代码只是直接使用它.在这种return Promise.resolve(value);情况下,调用代码需要消耗promise,就像任何其他promise一样(并且不能假设promise已经解决,即使它已经解决).

如果该函数是一个承诺链的开始,你可以使用return Promise.resolve(value);.(有用例;例如,如果函数可能需要也可能不需要启动异步进程:在不需要的分支中,你仍然会返回一个promise,因为分支必须做某事异步必须返回一个promise.)如果不是,你只需要使用return value;.

thencatch回调

我试图理解承诺链是如何工作的.

在这种情况下,你在谈论return value;return Promise.resolve(value);一个thencatch回调.这很容易:return Promise.resolve(value);在一个thencatch回调中没有任何意义,这是多余的和不必要的开销; 只是用return value;.

thencatch总是回报承诺.如果您的回调返回一个简单的值(return value;),则使用该值解析promise.如果你的回调返回一个thenable(松散地,一个承诺;例如,return Promise.resolve(value);),那么then/ 返回的承诺catch是从属于那个:当closeable结算时,承诺以同样的方式结算.(如果您的thencatch回调引发错误,则承诺会因该错误而被拒绝.)

如果您在该回调中启动新的异步进程,则有正当理由从a thencatch回调中返回promise ; 但是如果你已准备就绪,那么将它包含在承诺中是没有意义的 - then并且catch已经做到了.


Sur*_*yan 6

当您返回时Promise.resolve(),您将结果包装到一个 Promise 中,您可以在该 Promise 上调用then并创建then. 这对于单一类型的返回是可取的。

function resolve() {
   return Promise.resolve(15);
}

resolve().then(value => console.log(value));
Run Code Online (Sandbox Code Playgroud)

如果您有一个依赖于对服务器调用的逻辑,并且您可以在 中获得该结果,则cache您可以拥有一个在所有情况下都返回一个 Promise 的函数,因此您可以添加thenPromise 的结果。看看这个伪代码。

我希望我的函数在所有情况下都返回一个 Promise。所以在这里,如果我已经缓存了,userId我可以将结果包装到 Promise 中Promise.resolve

function getUserData() {
   if(cache.hasUserId) {
      return Promise.resolve(cache.hasUserId); // Is used to let the `then` functions to be called
   } else {
      return myAjaxCall();
   }
}

getUserData().then(userId => /* */);
Run Code Online (Sandbox Code Playgroud)

基于评论。裹进Promise.resolve()

function getUserData() {
   if(cache.hasUserId) {
      return Promise.resolve(cache.hasUserId); // Is used to let the `then` functions to be called
   } else {
      return myAjaxCall();
   }
}

getUserData().then(userId => /* */);
Run Code Online (Sandbox Code Playgroud)