XHR 进度事件微任务队列
XHR progress event microtask queue
我想在 Promise 中使用 XHR。
我按照 HTML5 rocks (1) 和 Mozilla 网站 (2) 上的建议创建了一个 XHR Promise。
它没有按预期工作。如果我有以下顺序来加载和处理文件:
sequence = xhrPromise('filename').
.then(parseFile)
.then(processFile)
.then(allSet);
如果我只是 运行 1 个序列,它会按预期工作。
如果我尝试 运行 N 个带有 Promise.all() 的序列到 download/process N 个文件,它会中断。
所有下载都从 "parallel" 开始,然后一旦第一个 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
it stops the download of other files
你这是什么意思? IO 发生在主线程之外,即使您执行javascript,下载也会继续。尽管如果您对结果进行了一些繁重的处理,您可能希望查看 webworkers 以不阻塞主 UI 线程。
我想在 Promise 中使用 XHR。 我按照 HTML5 rocks (1) 和 Mozilla 网站 (2) 上的建议创建了一个 XHR Promise。
它没有按预期工作。如果我有以下顺序来加载和处理文件:
sequence = xhrPromise('filename').
.then(parseFile)
.then(processFile)
.then(allSet);
如果我只是 运行 1 个序列,它会按预期工作。
如果我尝试 运行 N 个带有 Promise.all() 的序列到 download/process N 个文件,它会中断。
所有下载都从 "parallel" 开始,然后一旦第一个 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
it stops the download of other files
你这是什么意思? IO 发生在主线程之外,即使您执行javascript,下载也会继续。尽管如果您对结果进行了一些繁重的处理,您可能希望查看 webworkers 以不阻塞主 UI 线程。