[英]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.