但是此功能有什么用?如果我们立即兑现这一承诺,那么我们也可以直接在此HTML
履行处理程序内的下面编写代码。
示例:
then()
也就是说,我们最好将myPromise.then(function(someV) {
// ...
return v1;
}).then(function(v) {
// some code
移到第一个履行处理程序中。
(我认为通常的用例是返回一个// some code
,以便我们可以链接诺言。)
答案 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的操作。
是否包装并不重要,因为无论如何它只会拆开。 (当内部承诺解析后,它将展开内容传播到外部包装内容,直到无法继续进行。
从现在开始,感觉就像是诺言是更高级别的对象一样,我们只会使用它们。