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

时间:2017-04-23 16:23:08

标签: javascript promise bluebird progress

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

promise.all()

我试图找出一种方法,可以在每个单独的承诺解决时调用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); }); }; 方法。

1 个答案:

答案 0 :(得分:3)

(回答我自己的问题。)

我通过添加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创建的承诺将使用该值解析{{1} } 等着瞧。拒绝将跳过该处理程序并直接转到由Promise.all连接的处理程序。

The ascii progress library on npm

控制台中的结果输出:

console loading bar

(感谢T.J. Crowder对他的初步解释,这让我意识到我可以在我推动阵列的地方做到这一点。他说他更喜欢删除这个答案并让我发布这个。)