ES6 Promise then()履行处理程序返回值的用途是什么?

时间:2019-12-26 12:54:31

标签: javascript es6-promise

据说inside a .then() fulfillment handler, if a value v1 (a non promise object) is returned, then the promise as returned by then() will be a resolved promise, with the resolved value v1

但是此功能有什么用?如果我们立即兑现这一承诺,那么我们也可以直接在此HTML履行处理程序内的下面编写代码。

示例:

then()

也就是说,我们最好将myPromise.then(function(someV) { // ... return v1; }).then(function(v) { // some code 移到第一个履行处理程序中。

(我认为通常的用例是返回一个// some code,以便我们可以链接诺言。)

3 个答案:

答案 0 :(得分:0)

这是一个体面的问题。在其他“ monadic构造”中,有两个功能(一个用于映射,另一个用于映射promise),但是在2013年的某个时候,它决定不使用JavaScript执行相同的操作并允许返回值。

这对于在没有执行异步操作的情况下将带有诺言 的操作链接起来是有意义的。例如:

fetch('./foo').then(x => x.json()).then(JSON.parse);

最后JSON.parse部分与承诺或异步操作无关。

答案 1 :(得分:0)

在许诺链的很多情况下,第一个Promise处理程序返回一个普通值,但不能轻松地与链中的第二个Promise处理程序合并:

  • 中间诺言是函数的返回值:

    function fn() {
      return myPromise.then(… => { …; return v1; });
    }
    fn().then(…)
    
  • 第一个处理程序除了返回值外,还可能引发异常,在这种情况下,第二个处理程序不应运行,而应运行拒绝处理程序:

    myPromise.then(… => {
      if (…) throw new Error(…);
      else return v1;
    }).then(…, err => …);
    
  • 第一个处理程序还可能在其他执行路径上返回一个Promise,第二个处理程序需要等待它:

    myPromise.then(… => {
      if (…) return fetchSomethingByPromise();
      else return v1;
    }).then(…);
    
  • 除了第一个处理程序之外,还有一个拒绝处理程序,第二个处理程序的结果也应为:

    myPromise.then(… => v1, err => v2).then(…);
    

在所有这些情况下,then函数将需要处理纯值。当然,它们总是可以包裹在Promise.resolve(v1)中,但是决定不这样做。还有一个原因说明then需要处理原始值:void处理程序(例如,在链的末尾)返回undefined,而then将需要适当地处理它

答案 2 :(得分:0)

我认为我了解诺言,可以对此有所了解:

无论实现处理程序返回什么,原始值,不是thenables,thenables,真正的Promise的对象,该值将始终解析p,或变为Promise以便解析p,其中p返回.then()

我相信,这在Promise社区中称为展开。

因此,如果返回原始值或无法承受的对象:

此值将用于解析p,或者将其转化为Promise.resolve(v)并立即解析,这将立即解析p

如果它是可以实现的目标或真正的承诺:

它可以被称为:

obj.then(resolveP),其中resolveP是可以解析p的函数。

然后可实现的真实承诺都可以解决p

在promise社区中,即使是原始值或不可忍受的对象,也似乎会变成promise,以便将来的操作更加一致:对promise的操作。

是否包装并不重要,因为无论如何它只会拆开。 (当内部承诺解析后,它将展开内容传播到外部包装内容,直到无法继续进行。

从现在开始,感觉就像是诺言是更高级别的对象一样,我们只会使用它们。