处理承诺在 promise.all() 中单独解决

Handle promise resolves indvidually in promise.all()

有很多关于在使用 promise.all() 使用 catch 时如何处理错误的信息,但我想要实现的是每次处理此 [=12 中的承诺时=] 解决。我尝试这样做的原因是因为我试图在控制台中设置自定义进度条,并且每次解决承诺时我都需要调用 tick 方法。

this.getNewSources = function () {
    var bar = new ProgressBar(':bar', {total: this.getSourceMap().size});
    var timer = setInterval(function () {
        bar.tick();
        if (bar.complete) {
            console.log('\ncomplete\n');
            clearInterval(timer);
        }
    }, 100);

    let promiseArr = [];
    for (let x of this.getSourceMap().values()) {
        promiseArr.push(this.requestArticles(x.getName(), x.getCat(), x.getKey()));
    }

    return Promise.all(promiseArr).then(() => {
        console.log("Articles loaded this round: " + this.articles.size);
        console.log('all sources updated');
        this.loadedArticles = true;
        console.log(this.articleCount);
        console.log(this.articles.size);
    }).catch(e => {
        console.log(e);
    });
};

我正在尝试找出一种能够在每个单独的 promise 解析时调用 bar.tick() 方法的方法。

(回答我自己的问题。)

我通过添加一个 then 处理程序来处理它,我从 requestArticles 获得承诺(我将它们推入 promiseArr 数组)。我必须确保将处理程序从处理程序接收到的值传递出去,以便它传播到 Promise.all,请参阅 *** 行:

 this.getNewSources = function () {
    var bar = new ProgressBar(':bar', {total: this.getSourceMap().size});
    var timer = setInterval(function () {
        if (bar.complete) {
            console.log('\ncomplete\n');
            clearInterval(timer);
        }
    }, 100);

    function updateProgressBar() {
        bar.tick()
    }

    let promiseArr = [];
    for (let x of this.getSourceMap().values()) {
        promiseArr.push(this.requestArticles(x.getName(), x.getCat(), x.getKey())
            .then(value => {           // ***
                updateProgressBar();   // ***
                return value;          // ***
            })                         // ***
        );
    }

    return Promise.all(promiseArr).then(() => {
        console.log("Articles loaded this round: " + this.articles.size);
        console.log('all sources updated');
        this.loadedArticles = true;
        console.log(this.articleCount);
        console.log(this.articles.size);
    }).catch(e => {
        console.log(e);
    });
};

这样,我的处理程序会在承诺单独完成时被调用,并且由于我正在返回我收到的值,所以我调用 then 创建的承诺将使用该值解决,Promise.all 会看到。拒绝将跳过该处理程序并直接转到由 Promise.all.

连接的处理程序

The ascii progress library on npm

控制台输出结果:


(感谢 T.J. Crowder 的初步解释,这让我意识到我可以在推入阵列的地方做到这一点。他说他更喜欢删除那个答案并拥有我 post 这个代替。)