返回值与从函数

时间:2017-11-14 06:31:33

标签: javascript promise

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

3 个答案:

答案 0 :(得分:6)

  

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

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

在任何旧功能中

如果它只是任何旧函数(不是thencatch回调),则区别在于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;

thencatch回调

  

我试图了解承诺链是如何工作的。

在这种情况下,您在return value;return Promise.resolve(value);回调中谈论的是thencatch。这很简单:return Promise.resolve(value);then回调中的catch毫无意义,这是多余且不必要的开销;只需使用return value;

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

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

答案 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中
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()

不同,从函数返回值是同步的