承诺的打字稿递归

时间:2021-05-12 16:57:32

标签: typescript recursion promise

我需要在相互依赖的数据库上运行多个查询(在第二个之前我需要第一个等的结果)。 数据库描述了一个文件夹结构,所以调用模式是一个树状结构(首先是根,然后是分支等)。 在继续编写代码之前,我想保证所有查询都已完成。查询 (sqlite3) 是异步的。

这是一个模拟这些东西的(非工作)虚拟代码。我用 setTimeout() 函数替换了查询。

var array: Array<Number> = [];

const f = (iDepth: number): Array<Promise<any>> => {
    const pa = [];

    array.push(iDepth);
    if (iDepth > 1) {
        for (var i = 0; i < 2; i++) {
            pa.push(
                new Promise((resolve) => {
                    setTimeout(() => {
                        Promise.all(f(iDepth - 1)).then((prom) => {
                            return prom;
                        });
                    }, 1);

                    //return resolve(f(iDepth-1));
                })
            );
        }
    } else {
        return [Promise.resolve()];
    }

    console.log(pa);
    return pa;
};

Promise.all(f(4)).then(() => {
    console.log("***");
    console.log(array);
});

错误在哪里? 请注意,我是 TS 菜鸟。

1 个答案:

答案 0 :(得分:0)

这似乎是一个可行的解决方案:将带有回调的函数转换为 Promise。我只处理了快乐路径(resolve)。

var array:Array<Number> = [];

const f = (iDepth:number):Array<Promise<any>> => {
    const pa = [];

    array.push(iDepth);
    if (iDepth > 1) {
        for (var i = 0; i < 2; i++) {
            pa.push(new Promise((resolve) =>{
                setTimeout(() => {
                    return resolve(Promise.all(f(iDepth-1)));
                }, 100);
            }));
        }
    }
    return pa;
};

Promise.all(f(4)).then(() => {
    console.log('***Finished***')
    console.log(array);
})

请注意,我仍然不确定在概念层面上这是一个好的解决方案,还是专业的前端人员会以不同的方式处理整个事情。 另请注意,我可以删除内部选择器的 else 分支,并且其他内容仍然有效。