首页 > 解决方案 > 可迭代的 Promises,对每个 Promise 进行评估

问题描述

我有一个要处理的项目列表。让我们说 A、B、C、D、E .. 我有一个处理这些项目的承诺列表。每个 Promise 可以处理 1 个或多个项目。我有一份需要强制处理的项目清单。

假设A,C是强制性项目。

我可以在以下任何情况下返回

  1. P1,P2完成(不用管P3)
  2. P1,P3都完成了(不用管P2)
  3. P2,P3都完成了(不用管P1)
  4. P1,P2,P3 完成。

所有的 Promise(异步调用)都是按顺序从同一个项目开始的。我如何使用 Promise of iterables 来处理这个问题。?

我能想到的一种方法是

Promise.race(
    Promise.all(P1,P2),
    Promise.all(P1,P3),
    Promise.all(P2,P3),
    Promise.all(P1,P2,P3)
)

这应该有效。但这需要我根据mandatoryItems 和eachPromiseItems 来构造promise 组合列表。

有没有一种优雅的方式来在 JavaScript 中处理这种情况?

标签: javascriptecmascript-6promiseasync-awaites6-promise

解决方案


作为可选建议。您可以创建一个 Promise 包装器来处理您的所有 Promise 并在您需要时解决它。

function afterPromises(yourPromiseList, checker) {
    var _P = new Promise((res, rej) => {
        for (var p of yourPromiseList) {
            p.then((data) => {
                let checked = checker(data);
                if(checked===true){
                    res()
                }
                if(checked===false){
                    rej()
                }
            })
        }
    })
    return _P;
}

afterPromises([...yourPromiseList], () => {
    var itemsDict = {}// a closure var to register which your items processed
    return (data) => {
        itemsDict[data.id]=true
        //And your extra logic code
        return true
        //or return false
        //or reutrn undefined
    }
}).then(()=>{
    //resolved
})

未经测试的代码


推荐阅读