异步减少

时间:2019-07-14 17:35:18

标签: javascript

不确定为什么以下代码不起作用

const pPipe = async (x, ...fns) => fns.reduce(async (v, f) => await f(v), x);
const add1 = async (current) => current + 1;

(async () => {
    // should print 11
    console.log(await add1(10));
    // And it does

    // Should print 3
    console.log(await pPipe(1, add1, add1))
    // And it does not :(
})();

这将打印[object Promise]1。不确定为什么要返回对象承诺而不是附加对象吗?

2 个答案:

答案 0 :(得分:3)

reduce不支持异步。

您传递给它的异步函数会返回一个承诺,因此reduce使用 promise (而不是解决承诺的结果)作为累积值。

如果需要循环for,请使用await循环。

答案 1 :(得分:3)

由于您的reduce回调是异步的,因此在v回调的第二次调用以及后续调用中,累加器reduce将成为一个承诺。因此,您随后将 promise 传递给f

为确保您通过实际的,您需要等待该承诺(await v)。另一方面,对于await函数返回的内容,不必使用async,因此可以在await调用之前忽略f:< / p>

const pPipe = async (x, ...fns) => 
    fns.reduce(async (v, f) => f(await v), x);

const pPipe = async (x, ...fns) => fns.reduce(async (v, f) => f(await v), x);
const add1 = async (current) => current + 1;

(async () => {
    console.log(await add1(10)); // 11
    console.log(await pPipe(1, add1, add1)) // 3
})();