Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.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
Javascript 动态地履行承诺。all()_Javascript_Asynchronous_Promise - Fatal编程技术网

Javascript 动态地履行承诺。all()

Javascript 动态地履行承诺。all(),javascript,asynchronous,promise,Javascript,Asynchronous,Promise,我想弄明白为什么这段代码不起作用。我在一个依赖关系树(deepObject)中循环,对于每一个依赖关系树,我都希望运行一个返回承诺的函数。然后,我希望下一组函数在解析所有承诺之后发生,但是控制台日志在承诺内。所有函数都没有执行。ES6也很酷,如果你有更好的方法,但是我也很想知道为什么这段代码不起作用 更新为添加.catch(此操作无效) for(设i=0;i{ console.log('dep promises resolved'); log(`resolved:${JSON.stringify

我想弄明白为什么这段代码不起作用。我在一个依赖关系树(deepObject)中循环,对于每一个依赖关系树,我都希望运行一个返回承诺的函数。然后,我希望下一组函数在解析所有承诺之后发生,但是控制台日志在承诺内。所有函数都没有执行。ES6也很酷,如果你有更好的方法,但是我也很想知道为什么这段代码不起作用

更新为添加
.catch
(此操作无效)
for(设i=0;i{
console.log('dep promises resolved');
log(`resolved:${JSON.stringify(resolved)}`);
}).catch(err=>console.error(新错误(err));
//promise函数是递归的
承诺功能(obj){
返回新承诺((解决、拒绝)=>{
const keys=Object.keys(deepObj);
for(设j=0;j{
返回另一个函数();
}).然后(()=>{
回报你的承诺([
允诺人1(),
承诺人2(),
承诺人3(),
])。然后(已解决=>{
如果(已解析[0]。属性需要){
决心(正确);
}
决议(假);
});
}).catch(错误=>{
控制台错误(新错误(err));
过程。退出(1);
});
}
}
});
我知道这段对话--

在上面的第二个链接中,公认的答案表明:

在异步填充数组的情况下,您应该获得该数组的承诺,并使用.then(promise.all.bind(promise))。如果您不知道何时停止添加承诺,这无论如何都是不可能的,因为它们可能永远都无法解决

但是我没有使用异步来填充数组。我需要这个吗?我缺少什么

更新 由于我现在在
.then()
.catch()
中都有错误日志记录,所以似乎有什么地方出了问题,与内部发生的事情无关

在promiseFunction(deepObj[keys[j]]之前添加return语句破坏了递归。我从迭代173个对象到68个对象。添加捕获记录没有其他结果。上面的代码被更新以共享更多的递归fn。当我运行它时,它似乎执行了所有承诺,但我无法知道。我最关心的是知道1。promise.all的promise数组包含2.抓住递归对象中所有对象的所有承诺都得到解决的时刻

另外,作为记录,这些返回承诺的函数中的每一个都必须是异步的。为了简化和删除任何不必要的承诺,我已经重复了多次。任务很复杂。必须执行一系列步骤,它们是异步的,并且它们是链接的,因为它们必须重新执行按特定顺序解决

如果
Object.keys(obj[keys[j]]).length
true
则您永远不会调用
resolve
reject
,因此承诺永远不会解决

(请注意,递归调用
promiseFunction
会创建一个新的承诺,该承诺永远不会放入
promise.all

既然你的一些承诺无法解决问题,
Promise.all
也无法解决问题


你可能需要更多的东西,包括:

var promises = [];
processObject(obj);
Promise.all(promises).then(etc etc);

function processObject(object) {
    for ( loop; over; object ) {
        if (condition) {
             processObject(object[something]);
        } else {
             promises.push(new Promise( (res, rej) => {
                 // so something async
             });
        }
    }
}

让我们看看您的
承诺功能

for (let j = 0; j < keys.length; j++) {
    if (Object.keys(obj[keys[j]]).length) {
        //if you get in here, promiseFunction returns undefined, and it never gets resolved
        promiseFunction(obj[keys[j]]);
    } else {
        const dep = new Package(keys[j]);
        console.log(`skan dep: ${keys[j]}`);
        // and some more async hell that all resolves correctly
        //but even if it resolves correctly, you still have the if...
    }
}
现在,当您进入if语句时,您基本上是根据第二个
promiseFunction
是否正确地解决了问题来告诉要解决的承诺-您正在将解决方案委托给另一个承诺


我从来没有听说有人给它起过这个名字,但你可以把它看作是承诺递归:)

试着将拒绝函数记录到控制台日志中,看看是否有什么东西失败了“为了简洁起见省略了promiseFunction”-不要这样做。你不需要提供真实的东西,但你需要提供一个。我已经猜到了哪些代码可能会出现在缺少的地方,我无法重现问题:尝试
promisesArray.then(…).catch(err=>console.error('Failed',err))
。在
promiseFunction
中,if语句的第一块应
返回第二块
promiseFunction
的结果-否则它将不会解决任何问题!避免!我已尝试在最新更新中处理所有注释。添加return语句似乎会破坏它。我已尝试处理所有注释在最新的更新中。递归确实包含resolve/reject语句,但不是正确的语句。我建议您回到我说过的部分:(注意,递归调用promiseFunction会创建一个新的承诺,而这个承诺永远不会变成承诺。所有)。您为什么要使用
new promise
开始?@Kraken-“promiseFunction返回一个承诺”-它创建承诺a。如果你点击
If
语句,它就会递归调用自己。这会创建承诺B。如果点击
else
则承诺B被解析。承诺a不会被解析。
var promises = [];
processObject(obj);
Promise.all(promises).then(etc etc);

function processObject(object) {
    for ( loop; over; object ) {
        if (condition) {
             processObject(object[something]);
        } else {
             promises.push(new Promise( (res, rej) => {
                 // so something async
             });
        }
    }
}
for (let j = 0; j < keys.length; j++) {
    if (Object.keys(obj[keys[j]]).length) {
        //if you get in here, promiseFunction returns undefined, and it never gets resolved
        promiseFunction(obj[keys[j]]);
    } else {
        const dep = new Package(keys[j]);
        console.log(`skan dep: ${keys[j]}`);
        // and some more async hell that all resolves correctly
        //but even if it resolves correctly, you still have the if...
    }
}
for (let j = 0; j < keys.length; j++) {
    if (Object.keys(obj[keys[j]]).length) {
        //if you get in here, you're saying this promise will depend on how this second promiseFunction will resolve
        return promiseFunction(obj[keys[j]]);
    } else {
        //omitted for brevity...
        resolve('your value');
    }
}