2017-04-23 62 views
4

關於如何處理錯誤時使用catch使用promise.all()有很多信息,但我試圖實現的是處理這個promise.all()內部的一個承諾。我試圖這樣做的原因是因爲我試圖在控制檯中設置一個自定義進度條,每次解決承諾時都需要調用tick方法。句柄promise單獨解決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); 
    }); 
}; 

我想弄清楚的是能夠調用bar.tick()方法時,每一個人承諾解決辦法。

+0

@ T.J.Crowder非常感謝你的回答,我敢肯定,如果沒有你最初的解釋,我不會得到那個答案。 –

+0

我的榮幸。 :-)告訴你什麼:我會發佈一個新的答案與解釋。發佈你的答案時抓住你需要的任何東西,當你完成時ping我刪除我的答案。我很高興只是做了協助。 :-) –

+0

聽起來很棒! :D我仍然試圖將這個功能粘貼到原始功能中,儘管我沒有如此快速地完成所有功能。 –

回答

2

(回答我的問題。)

我加入了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); 
    }); 
}; 

這樣一來,我的處理程序被調用作爲單獨的承諾完整的,因爲我」 m返回我收到的價值,我呼叫then創建的承諾將以該值解析,即Promise.all將看到的值。拒絕將跳過該處理程序並直接轉到由Promise.all連接的處理程序。在控制檯

The ascii progress library on npm

結果輸出:

console loading bar


(與感謝T.J. Crowder對他最初的解釋,這讓我知道我可以做到這一點在那裏我推他說他喜歡刪除這個答案,並讓我發佈這個代替。)

+0

好看多了!只要將任何人感興趣的gif和鏈接添加到進度庫。 –

+0

唉,我希望在我加入那幾位後,它會留下你的頭像。 –

+0

它絕對沒錯。 :-)(對不起,我沒有注意到你添加了這個,所以當我保存時沒有提醒我,小心這樣的鏈接,有時候人們會認爲它是自我推銷的。) –