Promise 执行顺序问题。

我参考这个地址写了一些Promise的demo,

https://developers.google.com...

当我学到到这个例子时,

clipboard.png

我写了一个类似的demo:

https://jsfiddle.net/weisiwu/...

不过结果的执行顺序和给出的例子不一样,请问如何修改代码才能达到同时发起多个请求,但是返回的结果仍然按顺返

回(不是Promise.all那种全部完成后才返回的,而是有完成的且该完成项前面的也都完成了就返回该项这种)?

阅读 3.4k
3 个回答

改成这样就行了

var timeline = [
            function() {
              return new Promise(function(resolve, reject) {
                setTimeout(function() {
                  resolve('task5<br>');
                }, 1000);
              });
            },
            function() {
              return new Promise(function(resolve, reject) {
                setTimeout(function() {
                  resolve('task6<br>');
                }, 1500);
              });
            },
            function() {
              return new Promise(function(resolve, reject) {
                setTimeout(function() {
                  resolve('task7<br>');
                }, 2000);
              });
            },
            function() {
              return new Promise(function(resolve, reject) {
                setTimeout(function() {
                  resolve('task8<br>');
                }, 800);
              });
            }
          ];

          // 完成后立刻输出结果,但是按照顺序输出
          timeline.map(function(val) {
            return val();
          }).reduce(function(init, req) {
            return init.then(function() {
              return req;
            }).then(function(result){
                document.writeln(result)
            })
          }, Promise.resolve());

不明白的你这样做的意义是什么?换句话说就是现实中有没有这样的场景呢?
Promise.all([promiseArray])的话返回结果是按照promiseArray的顺序来安放的,为啥all不能满足你的需求呢?

如果你要发令枪响一起跑,运动员还是按照跑道顺序在终点排队,但是你这样做的退出条件又是啥呢?什么时候让到达终点的运动员开始排队? 你又什么时候去确认排队呢?

var timeline = [

        function() {
          return new Promise(function(resolve, reject) {
            setTimeout(function() {
              resolve('task5<br>');
            }, 1000);
          });
        },
        function() {
          return new Promise(function(resolve, reject) {
            setTimeout(function() {
              resolve('task6<br>');
            }, 1500);
          });
        },
        function() {
          return new Promise(function(resolve, reject) {
            setTimeout(function() {
              resolve('task7<br>');
            }, 2000);
          });
        },
        function() {
          return new Promise(function(resolve, reject) {
            setTimeout(function() {
              resolve('task8<br>');
            }, 800);
          });
        }
      ];

      
      timeline.map(function(val) {
        return val();
      }).reduce(function(init, req) {
        return init.then(function() {
          return req;
        }).then(function(result){
            document.writeln(result)
        })
      }, Promise.resolve());
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题