我遇到了以下有关在MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Using_promises#Composition)上承诺的顺序构成的示例:
使用一些聪明的JavaScript可以进行顺序组合:
[func1, func2, func3].reduce((p, f) => p.then(f), Promise.resolve())
.then(result3 => { /* use result3 */ });
基本上,我们将异步函数的数组简化为与Promise.resolve()。then(func1).then(func2).then(func3);等效的Promise链。
这可以做成可重用的compose函数,这在函数式编程中很常见:
const applyAsync = (acc,val) => acc.then(val);
const composeAsync = (...funcs) => x => funcs.reduce(applyAsync, Promise.resolve(x));
...
const transformData = composeAsync(func1, func2, func3);
const result3 = transformData(data);
我不明白的是,为什么他们写道,以上代码的最后一行将result3
设置为transformData(data)
,因为transformData(data)
会返回一个承诺。
最后一行不是:
transformData(data).then((result3) => {
// Do something with result3 ...
});
?
文档继续:
在ECMAScript 2017中,可以使用async / await更简单地完成顺序合成:
let result;
for (const f of [func1, func2, func3]) {
result = await f(result);
}
/* use last result (i.e. result3) */
这里result
的确是func3
的结果(成功达成诺言的result3
)。
感谢您的关注。