JS许诺的顺序组成

时间:2019-04-20 20:46:01

标签: javascript es6-promise sequential-composition

我遇到了以下有关在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)。

感谢您的关注。

0 个答案:

没有答案
相关问题