我需要在相互依赖的数据库上运行多个查询(在第二个之前我需要第一个等的结果)。 数据库描述了一个文件夹结构,所以调用模式是一个树状结构(首先是根,然后是分支等)。 在继续编写代码之前,我想保证所有查询都已完成。查询 (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 菜鸟。
答案 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 分支,并且其他内容仍然有效。