不确定为什么以下代码不起作用
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
。不确定为什么要返回对象承诺而不是附加对象吗?
答案 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
})();