繁体   English   中英

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

[英]What is the use of ES6 Promise then() fulfillment handler returning a value?

据说.then()执行处理程序中,如果返回值v1 (非承诺对象),则then()返回的承诺将是一个已解决的承诺,具有已解决的值v1

但是这个功能有什么用呢? 如果我们立即解决这个承诺,我们不妨直接在then()履行处理程序中编写代码。

例子:

myPromise.then(function(someV) {
  // ...
  return v1;
}).then(function(v) {
  // some code

也就是说,我们不妨将// some code移动到第一个履行处理程序中。

(我认为通常的用例是返回一个new Promise()以便我们可以链接承诺。)

这是一个体面的问题。 在其他“一元结构”中,有两个函数(一个用于映射,另一个用于映射用于承诺),但在 2013 年的某个时候,决定不在 JavaScript 中做同样的事情并允许返回一个值。

这对于在执行异步操作的情况下使用 Promise 链接操作是有意义的。 例如:

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

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

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

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

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

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

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

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

在所有这些情况下, then函数都需要处理普通值。 当然,它们总是可以包含在Promise.resolve(v1) ,但决定不要求这样做。 另外还有一个原因,为什么then将需要处理的原始值:一个无效的处理程序(例如,在链的末端)的回报undefined ,以及then将需要适当地处理这个问题。

我想我更了解 Promise 以便对此有所了解:

无论履行处理程序返回什么,原始值,不是 thenables 的对象,thenables,真实的承诺,这个值总是会解析p ,或者做成一个承诺,以便它解析p ,其中p.then()返回的内容。

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

因此,如果返回一个原始值或一个不可用的对象:

这个值将用于解析p ,或者将其制作Promise.resolve(v)即解析的Promise.resolve(v) ,这就是立即解析p

如果它是一个 thenable 对象,或者一个真正的 promise:

它可以被称为:

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

那么 thenable 和 real 承诺都可以解析p

在promise社区中,似乎即使是原始值或者不可用的对象,也会被做成promise,这样以后的操作就更加一致了:对promise的操作。

如果您包装和包装并不重要,因为无论如何它都会打开和打开。 (当内部承诺解决时,它将解包传播到外部包装,直到它无法继续。)

几乎感觉好像承诺是更高级别的对象,从现在开始,我们将只使用它们。 (当我们在处理promise和普通值时,一切都会被转换成promise(通过使用Promise.resolve(value)进行处理)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM