我有理解当我们简单地返回一个值或者从函数返回Promise.resolve()
时会发生什么。具体来说:我试图理解promises链是如何工作的。我正在链接方法并验证值是否在最后一次调用then
的方法中到达。我只是想了解将承诺退回then
,将Promise.resolve()
返回then
,并仅将值返回then
之间的区别。
答案 0 :(得分:6)
我在理解当我们简单地返回一个值或从函数返回
Promise.resolve()
时会发生什么时遇到问题。
所以(至少)有两种不同的情景:
如果它只是任何旧函数(不是then
或catch
回调),则区别在于return value;
直接返回值,而return Promise.resolve(value);
返回<使用该值解决了em> promise 。它改变了调用代码使用结果的方式。在return value;
的情况下,调用代码只是直接使用它。在return Promise.resolve(value);
的情况下,调用代码需要使用promise,就像任何其他promise一样(并且不能假设promise已经解决,即使它已经解决)。
如果该函数是声明链的开头,则使用return Promise.resolve(value);
。 (有用例;例如,如果函数可能需要也可能不需要启动异步进程:在不需要的分支中,你仍然会返回一个promise,因为分支必须做某事异步必须返回一个promise。)如果不是,你只需使用return value;
。
then
或catch
回调我试图了解承诺链是如何工作的。
在这种情况下,您在return value;
或return Promise.resolve(value);
回调中谈论的是then
与catch
。这很简单:return Promise.resolve(value);
或then
回调中的catch
毫无意义,这是多余且不必要的开销;只需使用return value;
。
then
和catch
总是返回承诺。如果您的回调返回一个简单值(return value;
),则使用该值解析promise。如果你的回调返回一个 thenable (松散地,一个承诺;例如,return Promise.resolve(value);
),那么then
/ catch
返回的承诺是从属于那个:当theable得到解决时,承诺以同样的方式解决。 (如果您的then
或catch
回调引发错误,则承诺会因该错误而被拒绝。)
如果您在该回调中启动新的异步进程,则有正当理由从then
或catch
回调中返回承诺;但是如果你已准备就绪,那么将它包含在承诺中是没有意义的 - then
和catch
已经做到了。
答案 1 :(得分:3)
当您返回Promise.resolve()
时,您将结果包装到Promise中,您可以在其上调用then
并创建then
链。对于单一类型的返回,这是首选。
function resolve() {
return Promise.resolve(15);
}
resolve().then(value => console.log(value));
如果您的逻辑依赖于对服务器的调用,并且您可以在cache
中获得该结果,那么您可以拥有一个在所有情况下都返回Promise的函数,因此您可以添加{ {1}}表示Promise的结果。看看这个伪代码。
我希望我的功能在所有情况下都会返回一个Promise。所以,如果我已缓存then
,我可以使用userId
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 => /* */);
Promise.resolve()
答案 2 :(得分:0)
Promise
是创建承诺时未必知道的值的代理。它允许您将处理程序与异步操作的最终成功值或失败原因相关联。这允许异步方法返回类似于同步方法的值:异步方法返回一个承诺,以便在将来的某个时刻提供值。 MDN
Promise.resolve(value)
方法返回使用给定值解析的Promise对象。如果值是一个值(即具有&#34;那么&#34;方法),则返回的promise将&#34;跟随&#34;那么可靠,采用其最终状态;如果值是promise,则该对象成为对Promise.resolve的调用的结果;否则返回的承诺将通过该值来实现。 MDN Promise.reslove
与Promise.resolve()