如何在承诺中处理此类案件?

时间:2018-02-13 12:28:33

标签: javascript promise

我有一个数组,如果某些条件成立,每个元素将通过2个嵌套的异步任务。否则,将完成1个正常同步任务,并在完成所有操作后返回带有新更新的数组。

以下是我的代码的简化版本:

    someFunction(array) {
    array.forEach((element, index) => {
      if (some checks hold) {
        asyncTask1(element).then(updatedElement => {
          asyncTask2(updatedElement).then(elementFinal => {
            array[index] = elementFinal;
          });
        });
        return;
      }
      array[index] = normalSyncTask(element);
    });
  }

我需要此函数才能在处理完所有元素时返回更新的数组:

someFunction(array).then(updatedArray => { // Do something with the updated array });

这是我的尝试:

someFunction(array) {
    var promises = [];
    array.forEach((element, index) => {
      if (some checks hold) {
        var promise = asyncTask1(element);
        promise.then(updatedElement => {
          asyncTask2(updatedElement).then(elementFinal => {
            array[index] = elementFinal;
          });
        });
        promises.push(promise);
        return;
      }
      array[index] = normalSyncTask(element);
    });
    return Promise.all(promises).then(() => Promise.resolve(array));
  }

请原谅我的愚蠢尝试,但无论我读了多少教程,我都无法很好地理解承诺如何正常工作。

2 个答案:

答案 0 :(得分:3)

这应该有效:

someFunction(array){
    const promises = array.map((element, index) => {
        if(some checks hold){
            return asyncTask1(element).then(asyncTask2);
        }
        return normalSyncTask(element);
    });

    return Promise.all(promises).then((values) => {
        console.log('Everything is OK', values);
    });
}

您使用Array.map生成一系列承诺,并等待使用Promise.all解决所有承诺。

Promise.all将忽略非承诺的值,并返回函数返回的values数组中的promises结果。

答案 1 :(得分:1)

你的尝试非常接近

function someFunction(array) {
    var promises = [];
    array.forEach((element, index) => {
        if (some checks hold) {
            // push Promise from last async function
            promises.push(asyncTask1(element).then(updatedElement => {
                return asyncTask2(updatedElement).then(elementFinal => {
                    array[index] = elementFinal;
                });
            }));
            return;
        }
        array[index] = normalSyncTask(element);
    });
    return Promise.all(promises).then(() => array);
}
相关问题