Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 承诺的类型脚本递归_Typescript_Recursion_Promise - Fatal编程技术网

Typescript 承诺的类型脚本递归

Typescript 承诺的类型脚本递归,typescript,recursion,promise,Typescript,Recursion,Promise,我需要在一个相互依赖的数据库上运行多个查询(在第二个查询之前,我需要第一个查询的结果等)。 数据库描述了一个文件夹结构,因此调用模式是一个树状结构(根是第一个,然后是分支等)。 在继续编写代码之前,我想保证所有查询都已完成。查询(sqlite3)是异步的 下面是一个(非工作)虚拟代码,用于对内容进行建模。我用setTimeout()函数替换了查询 var数组:数组=[]; 常量f=(iDepth:number):数组=>{ 常数pa=[]; array.push(iDepth); 如果(iDep

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

下面是一个(非工作)虚拟代码,用于对内容进行建模。我用setTimeout()函数替换了查询

var数组:数组=[];
常量f=(iDepth:number):数组=>{
常数pa=[];
array.push(iDepth);
如果(iDepth>1){
对于(变量i=0;i<2;i++){
推搡(
新承诺((决议)=>{
设置超时(()=>{
Promise.all(f(iDepth-1))。然后((prom)=>{
返回prom;
});
}, 1);
//返回解析(f(iDepth-1));
})
);
}
}否则{
return[Promise.resolve()];
}
控制台日志(pa);
返回pa;
};
承诺。全部(f(4))。然后(()=>{
console.log(“***”);
console.log(数组);
});
错误在哪里?
请注意,我是TS noob。

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

var数组:数组=[];
常量f=(iDepth:number):数组=>{
常数pa=[];
array.push(iDepth);
如果(iDepth>1){
对于(变量i=0;i<2;i++){
pa.push(新承诺((解决)=>{
设置超时(()=>{
返回解析(Promise.all(f(iDepth-1));
}, 100);
}));
}
}
返回pa;
};
承诺。全部(f(4))。然后(()=>{
console.log(“***已完成***”)
console.log(数组);
})
请注意,我仍然不确定在概念层面上这是一个好的解决方案,或者专业的frontender会以不同的方式处理整个问题。
还要注意的是,我可以删除内部选择器的else分支,而这些分支仍然有效。

错误是什么?你想干什么?您正在遍历的数据的形状是什么?“我用setTimeout()函数替换了查询。”请注意,这通常不是一个好主意,因为
setTimeout
不返回承诺。你也永远不会兑现你的承诺。你能展示一下实际的代码吗?目前还不清楚这些查询是如何相互依赖的。如果每一个都依赖于前面的结果,并且它们是按顺序运行的,那么您不应该在任何地方构建承诺数组(或使用
Promise.all
)。嗨,acutal代码非常混乱,这就是我编写此伪代码的原因。数据库查询是sqlite3的,比如each()和其他类似的函数(),并且像setTimeout()一样使用回调,这就是为什么我用它替换了东西。然而,如果我能强迫所有的事情进入一个同步的工作对我来说是好的@Bergi这就是我使用Promise.all()的原因。然后请尝试将sqlite内容重构为一个帮助函数(然后可以使用
setTimeout
模拟该函数),但是您仍然需要向我们显示您正在传递到这个helper函数中的数据,这些数据来自前面的查询结果。另外,请注意,我觉得在第11行中使用“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);
})