2017-04-23 10 views
4

promise.all()を使用しているときにエラーを処理する方法については多くの情報がありますが、私が達成しようとしているのは、このpromise.all()の中の約束を解決することです。私がこれをやろうとしている理由は、コンソールにカスタムプログレスバーを設定しようとしているため、約束が解決されるたびにtickメソッドを呼び出す必要があるからです。ハンドルの約束はpromise.all()でindvidually解決します

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

(自分の質問に答える。)

私は(私はpromiseArr配列にそれらをプッシュしています)requestArticlesから約束を取得していますthenハンドラを追加することによって、それを処理していました。私はそれが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のおかげで

console loading bar


(彼はその答えを削除し、代わりに投稿してもらいたいと言った)

+0

もっとよく見る!誰かが興味を持っている場合に備えて、GIFと進行状況ライブラリへのリンクを追加するだけです。 –

+0

私はそれらのいくつかのビットを追加した後、あなたのアバターを残すことを望んでいた。 –

+0

それは絶対にうまくいかない。 :-)(申し訳ありませんが、あなたがそれを追加したことに気付かず、保存したときにSOが私に警告しなかったので、そのようなリンクには注意してください。 –

関連する問題