【发布时间】:2021-11-21 23:58:38
【问题描述】:
我想实现对promise方法times的递归串行调用,将fn函数调用N次的结果返回到数组中。
目前我在times函数中增加了一个属性results,用来保存每次fn调用的结果。
我也不想使用模块范围的变量来保存结果。或者,通过传递其他参数(如times(fn, n, results))来保存结果,它会破坏函数签名。
async/await 语法是不允许的。
有没有办法只使用函数局部变量来保存结果?
const times = Object.assign(
(fn: (...args: any) => Promise<any>, n: number = 1) => {
if (n === 0) return times.results;
return fn().then((res) => {
times.results.push(res);
return times(fn, --n);
});
},
{ results: [] as any[] },
);
用法:
const createPromise = (args: any) =>
new Promise((resolve) => {
setTimeout(() => {
console.log(`[${new Date().toISOString()}]args: `, args);
resolve(args);
}, 1000);
});
async function test() {
const actual = await times(() => asyncFn('data'), 3);
console.log(actual); // output: [ 'data', 'data', 'data' ]
}
【问题讨论】:
-
你可以使用
async/ await吗? -
@Rajesh 更新了问题。这是不允许的。
-
您正在尝试做一些承诺旨在解决的事情......顺序和回调地狱......也就是说,async/await 是最简单的选择。考虑递归但有点复杂
标签: javascript typescript promise