Javascript 如何获得XMLHttpRequest承诺进度

Javascript 如何获得XMLHttpRequest承诺进度,javascript,ajax,xmlhttprequest,promise,Javascript,Ajax,Xmlhttprequest,Promise,我正在使用JSPromise重构我们的JSAPI。然而,我遇到了一个问题,使我无法继续前进 基本上,我们的API之一是发出异步GET请求并下载一个大文件 因此,API的使用如下所示: var callback = { success: function(data){...}, failure: function(data){...} } Test(token).download(url).then(callback.success, callback.failure); va

我正在使用JSPromise重构我们的JSAPI。然而,我遇到了一个问题,使我无法继续前进

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

因此,API的使用如下所示:

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

Test(token).download(url).then(callback.success, callback.failure);
var callback = {
  success: function(data){...},
  failure: function(data){...},
  progress: function(data){...}
}    

Test(token).download(url, callback.progress).then(callback.success, callback.failure);
Test函数向url发出XHR请求,并在onload&onerror事件处理程序中调用回调函数

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


只有在解决承诺时才会调用callback.success。那么,我应该如何实现UI刷新回调,它应该在测试函数内部XHR组件的onprogress事件处理程序中调用?

由于JavaScript中的承诺只是状态机,因此不可能获得承诺的进度。你得用其他方法


例如,请参阅本文:

承诺对于多个进度通知来说根本不是一个好的体系结构匹配。承诺是一种单向状态机,用于传递完成或错误信息——这正是它们设计的全部目的。它们没有任何内置机制来执行多个进度通知

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

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

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

Test(token).download(url).then(callback.success, callback.failure);
var callback = {
  success: function(data){...},
  failure: function(data){...},
  progress: function(data){...}
}    

Test(token).download(url, callback.progress).then(callback.success, callback.failure);
然后,在
download()
函数中,可以根据需要多次调用进度回调


就个人而言,我认为如果您只是返回承诺,让他们自己提供解析和拒绝处理程序,而不是隐藏承诺,让您的呼叫者接受2013年回调体系结构,那么这对您的呼叫者更有用。返回承诺允许他们使用所有的承诺特性,如链接、与其他承诺的聚合、错误在自己代码中的传播等


因此,它们传递的不是包含多个回调的
回调
对象,而是进度回调,然后返回承诺。然后调用方可以在返回的承诺上附加自己的解析和拒绝处理程序。2016年,承诺在ES6中标准化。没有必要对您的来电者隐瞒这些承诺,而且有充分的理由回报承诺,这样您的来电者也可以利用承诺的好处。

创建多个独立的承诺。@zerkms,但我只想发出一个下载请求并下载一个文件。实际上,我正在使用@deepsky上的XMLHttpRequest承诺示例-嗯,我不同意那个例子是如何运作的。在承诺标准化的情况下,您也可以将承诺返回给您的来电者,让他们享受使用承诺的好处。如果不让来电者使用返回的承诺,那么使用承诺的好处将减少80%。