【问题标题】:XHR progress event microtask queueXHR 进度事件微任务队列
【发布时间】:2015-08-20 08:29:46
【问题描述】:

我想通过 Promise 使用 XHR。 我按照 HTML5 Rocks (1) 和 Mozilla 网站 (2) 上的建议创建了 XHR Promise。

它没有按预期工作。如果我有以下顺序来加载和处理文件:

sequence = xhrPromise('filename').
  .then(parseFile)
  .then(processFile)
  .then(allSet);

如果我只运行 1 个序列,它会按预期工作。

如果我尝试使用 Promise.all() 运行 N 个序列来下载/处理 N 个文件,它会中断。

所有下载都以“并行”方式开始,一旦第一个 XHR 请求完成,它会停止下载其他文件,运行该文件的完整序列,然后继续下载剩余文件。然后,一旦另一个文件完成,它会阻止下载,运行此文件的序列,然后继续下载等等。

这似乎是预期的行为,因为 XHR 进度事件被抛出主任务队列并且承诺正在使用微任务队列。

有意义吗?

如果我使用“fetch”API 而不是 XHR,它似乎可以按预期工作,但无法监控下载进度对我来说是一个交易破坏者。

是否有解决此问题的好方法?

(1)http://www.html5rocks.com/en/tutorials/es6/promises/

(2)https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise

【问题讨论】:

  • 获取 API 有进度挂钩 - 只是说。
  • 好吧,这不是规范中所说的 (fetch.spec.whatwg.org),我可以找到任何示例。你能举个例子或一些文档来指点我吗?

标签: javascript xmlhttprequest promise ecmascript-6 fetch-api


【解决方案1】:

它会停止下载其他文件

你这是什么意思? IO 发生在主线程之外,即使您执行 javascript,下载也会继续。虽然如果您对结果进行一些繁重的处理,您可能希望查看webworkers 以不阻塞主 UI 线程。

【讨论】:

  • 在 chrome 开发工具中,XH​​R 请求的状态变为“待处理”,并在繁重的 javascript 任务完成后重新启动。是的,webworkers 可能是运行繁重的 JS 任务的最佳选择......
  • promise 中运行的 js 任务太重了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-18
  • 2021-05-17
  • 2022-10-06
  • 2019-07-12
  • 2010-10-29
  • 2019-07-25
  • 2015-06-20
相关资源
最近更新 更多