0

我正在尝试从我的服务器下载文件,然后在加载的数据上运行 Promises。我的问题是,我的 Promise 似乎出于某种原因阻止了一切:

它开始下载所有文件,一旦下载第一个文件,它会阻止其他文件下载并运行其“onLoad”回调完整承诺链,然后继续下载剩余的文件。新文件完成后,它会阻止其他下载并运行承诺链等。

我的 onload 回调包含以下内容:

function(response) {

  window.console.log('on load callback...');

      var sequence = Promise.resolve();
      sequence
      .then(function(){
        sleep(10000);
        window.console.log('sleep 1 is over...');
        return 'DONE!';
      })
      .then(function(){
        sleep(10000);
        window.console.log('sleep 2 is over...');
        return 'DONE!';
      })
      .then(function(){
        sleep(10000);
        window.console.log('sleep 3 is over...');
        return 'DONE!';
      });
}

我的睡眠功能如下:

 function sleep(milliseconds) {
   var start = new Date().getTime();
   for (var i = 0; i < 1e7; i++) {
     if ((new Date().getTime() - start) > milliseconds){
       break;
    }
  }
 }

在控制台中它返回:

on load callback...
sleep 1 is over...
sleep 2 is over...
sleep 3 is over...
on load callback...
sleep 1 is over...
sleep 2 is over...
sleep 3 is over...
on load callback...
sleep 1 is over...
sleep 2 is over...
sleep 3 is over...
on load callback...
sleep 1 is over...
sleep 2 is over...
sleep 3 is over...

任何帮助,将不胜感激。

我可以理解当“睡眠”运行时下载被阻止,但我不明白为什么它会在继续下载剩余文件之前运行所有“睡眠 1”、“睡眠 2”和“睡眠 3”。

==== 编辑 ====

我使用“promisified” XMLHttpRequest 和 Promise.all() 加载文件。( http://www.html5rocks.com/en/tutorials/es6/promises/ )

最好的,尼古拉斯

4

2 回答 2

0

但我不明白为什么它会在继续下载剩余文件之前运行所有“睡眠 1”、“睡眠 2”和“睡眠 3”。

当有多个 Promise 等待解决时,Promise 回调基本上以任意顺序1运行。在您的情况下,它只是选择运行sequence回调(不幸的是,每个回调都需要很长时间),然后返回onload解决其他承诺的 ajax 请求的回调,然后运行它们的回调,继续下载剩余文件。

解决方案很简单:不要使用sleep,也不要使用长时间运行的代码(但要使其异步)。

1:当然,链(.then(A).then(B))中的回调需要按照承诺的顺序运行。
并且 Promises/A+ 要求同一个 Promise 上的多个回调按照注册的顺序运行 ( p.then(A); p.then(B);)。
并且 ECMAScript6 要求多个已解决的 Promise 上的回调按照 Promise 解决的顺序运行。

于 2015-06-02T14:18:01.213 回答
0

我想你在这里问的是(这个可怕的忙着等待的 sleep() 函数,任何人都不应该在实际代码中使用)是为什么所有.then()函数都优先onload于 JS 事件循环中的事件?

他们这样做了,这是因为 Promise 在微任务队列上运行,该队列与主任务队列分开,并且在后者之前排空。

另请参阅另一个问题的答案

于 2015-06-02T17:00:57.363 回答