the*_*mer 5 javascript promise
我有理解当我们简单地返回一个值或Promise.resolve()从函数返回时会发生什么.具体来说:我试图理解promises链是如何工作的.我正在链接方法并验证值是否在最后一次调用的方法中到达then.我只是想了解返回承诺之间的差异then,返回Promise.resolve()来then,并返回只是一个值then.
我有理解当我们简单地返回一个值或
Promise.resolve()从函数返回时会发生什么.
所以(至少)有两种不同的场景:
如果它只是任何旧函数(不是then或catch回调),那么区别在于return value;直接返回值,而return Promise.resolve(value);返回使用该值解析的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是从属于那个:当closeable结算时,承诺以同样的方式结算.(如果您的then或catch回调引发错误,则承诺会因该错误而被拒绝.)
如果您在该回调中启动新的异步进程,则有正当理由从a then或catch回调中返回promise ; 但是如果你已准备就绪,那么将它包含在承诺中是没有意义的 - then并且catch已经做到了.
当您返回时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)
| 归档时间: |
|
| 查看次数: |
3633 次 |
| 最近记录: |