推空承诺并稍后重新分配

时间:2019-04-05 01:06:25

标签: 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);
    });

由于存在一个条件,我需要先获取该值然后返回一个诺言,因此我正在创建一个空诺言并重新分配它。但是,这是行不通的,也就是说Promise.all永远不会返回结果。我在做什么错了?

2 个答案:

答案 0 :(得分:6)

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

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

或更简单:

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

    return waitForSomeValue.then(functionThatReturnsAPromise);   
});

答案 1 :(得分:3)

根据您提供的代码

const promises = array.map(element => someCondition 
   ? waitForSomeValue.then(functionThatReturnsAPromise)
   : functionThatReturnsAPromise(element);
);