javascript - 如何获取 XMLHttpRequest Promise 进度

标签 javascript ajax xmlhttprequest promise

我正在使用 JS Promise 来重构我们的 JS API。然而我遇到了一个问题,阻止我进一步前进。

基本上,我们的 API 之一是发出异步 GET 请求并下载大文件。

所以API的用法是这样的:

var callback = {
  success: function(data){...},
  failure: function(data){...}
}    

Test(token).download(url).then(callback.success, callback.failure);

Test 函数向 URL 发出 XHR 请求,并调用 onload 和 onerror 事件处理程序中的回调函数。

问题是在下载过程中,UI需要刷新,即进度条,这是在onprogress中处理的。

callback.success 只会在 Promise 解决时调用一次。那么我应该如何实现 UI 刷新回调,该回调应该在 Test 函数内部 XHR 组件的 onprogress 事件处理程序中调用?

最佳答案

Promise 根本就不是多个进度通知的良好架构匹配。 Promise 是一种单向状态机,旨在传达完成或错误 - 这实际上就是它们的设计目的。它们没有任何内置机制来执行多个进度通知。

相反,对于进度通知,您应该使用其他一些架构机制,例如每次调用的常规回调或触发多个进度事件的 eventEmitter

在您目前展示的方案中,它可能如下所示:

var callback = {
  success: function(data){...},
  failure: function(data){...},
  progress: function(data){...}
}    

Test(token).download(url, callback.progress).then(callback.success, callback.failure);

然后,在您的 download() 函数中,您可以根据需要多次调用进度回调。


就我个人而言,我认为如果您只是返回 Promise 并让他们自己提供解析和拒绝处理程序,而不是隐藏 Promise 并让您的调用者接受 2013 年回调架构,这对您的调用者会更有用。返回 Promise 允许他们使用所有 Promise 功能,例如链接、与其他 Promise 的聚合、自己代码中的错误传播等...

因此,与其传递具有多个回调的回调对象,不如传递进度回调,然后返回一个 promise 。然后,调用者可以在返回的 Promise 上附加自己的解析和拒绝处理程序。现在是 2016 年,Promise 在 ES6 中实现了标准化。没有必要向调用者隐藏它们,并且有充分的理由返回 Promise,以便调用者也可以利用 Promise 的好处。

关于javascript - 如何获取 XMLHttpRequest Promise 进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36736677/

相关文章:

javascript - 从 ID 调用函数

javascript - 有没有办法设置 SegmentPoints 和 Handles 的样式?

javascript - 将 X-CSRF-Token header 全局添加到 XMLHttpRequest() 的所有实例;

javascript - 无法使用纯 JavaScript 从 AJAX 对象检索结果

php - 如何从 Web 委派长时间的后台任务,并在完成后恢复控制

javascript - 基于发布值的 XMLHttpRequest 响应状态

javascript - 如何将数据从一个对象插入到另一个具有不同结构的对象以生成第三个对象

javascript - 悬停弹出窗口不适用于数据表的第二页

c# - 系统.InvalidOperationException : Missing parameter

jquery - 使用 jQuery .load() 加载 jsp 页面会导致 fmt :message 出现问题