推空承诺并稍后重新分配

3zz*_*zzy 0 javascript promise

var promises = []

array.forEach(element, i => {
    promises[i] = functionThatReturnsAPromise(element);
    if (somecondition) {
        promises[i] = new Promise(function(){}); // empty initial promise
        waitForSomeValue.then(function(result){
            promises[i] = functionThatReturnsAPromise(result); // reassign promise
        });   
    }
});

Promise.all(promises)
    .then(function(result){
        console.log(result);
    });
Run Code Online (Sandbox Code Playgroud)

由于在某种情况下,我需要先获取值然后返回承诺,所以我要创建一个空的承诺并重新分配它。但是,这是行不通的,也就是说Promise.all永远不会返回结果。我究竟做错了什么?

tka*_*usl 6

您的empty承诺永远无法实现。在Promise.all调用之后,在数组中重新分配值不会发生任何变化。相反,您应该使用链接来分配一个承诺,该承诺同时执行两个承诺,等待另一个值,然后等待您的值。

array.forEach(element, i => {
    if(!somecondition)
        promises[i] = functionThatReturnsAPromise(element);
    else {
        promises[i] = waitForSomeValue.then(function(result){
            return functionThatReturnsAPromise(result);
        });   
    }
});
Run Code Online (Sandbox Code Playgroud)

甚至更简单:

promises = element.map(el => {
    if(!somecondition)
        return functionThatReturnsAPromise(el);

    return waitForSomeValue.then(functionThatReturnsAPromise);   
});
Run Code Online (Sandbox Code Playgroud)