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

前端之家收集整理的这篇文章主要介绍了javascript – 处理承诺在promise.all()中单独解决前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

  1. this.getNewSources = function () {
  2. var bar = new ProgressBar(':bar',{total: this.getSourceMap().size});
  3. var timer = setInterval(function () {
  4. bar.tick();
  5. if (bar.complete) {
  6. console.log('\ncomplete\n');
  7. clearInterval(timer);
  8. }
  9. },100);
  10. let promiseArr = [];
  11. for (let x of this.getSourceMap().values()) {
  12. promiseArr.push(this.requestArticles(x.getName(),x.getCat(),x.getKey()));
  13. }
  14. return Promise.all(promiseArr).then(() => {
  15. console.log("Articles loaded this round: " + this.articles.size);
  16. console.log('all sources updated');
  17. this.loadedArticles = true;
  18. console.log(this.articleCount);
  19. console.log(this.articles.size);
  20. }).catch(e => {
  21. console.log(e);
  22. });
  23. };

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

最佳答案
(回答我自己的问题.)

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

  1. this.getNewSources = function () {
  2. var bar = new ProgressBar(':bar',{total: this.getSourceMap().size});
  3. var timer = setInterval(function () {
  4. if (bar.complete) {
  5. console.log('\ncomplete\n');
  6. clearInterval(timer);
  7. }
  8. },100);
  9. function updateProgressBar() {
  10. bar.tick()
  11. }
  12. let promiseArr = [];
  13. for (let x of this.getSourceMap().values()) {
  14. promiseArr.push(this.requestArticles(x.getName(),x.getKey())
  15. .then(value => { // ***
  16. updateProgressBar(); // ***
  17. return value; // ***
  18. }) // ***
  19. );
  20. }
  21. return Promise.all(promiseArr).then(() => {
  22. console.log("Articles loaded this round: " + this.articles.size);
  23. console.log('all sources updated');
  24. this.loadedArticles = true;
  25. console.log(this.articleCount);
  26. console.log(this.articles.size);
  27. }).catch(e => {
  28. console.log(e);
  29. });
  30. };

这样,我的处理程序被调用为单独完成的promise,并且由于我返回了我收到的值,我调用后创建的promise将使用该值解析,Promise.all将会看到.拒绝将跳过该处理程序并直接转到Promise.all连接的处理程序.

The ascii progress library on npm

控制台中的结果输出

console loading bar

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

猜你在找的JavaScript相关文章