Javascript 承诺:当进度更新的数量未知时重构进度

Javascript 承诺:当进度更新的数量未知时重构进度,javascript,node.js,promise,q,when-js,Javascript,Node.js,Promise,Q,When Js,在一些领先的promise库(Q、Bluebird)中,progress处理程序已被弃用,并且也已从新的promise库中删除。虽然我理解取消进度事件背后的原因,但我很难重新考虑我已经非常习惯的以下模式: var download = function(url) { var deferred = Q.defer(); ... http.get(url, function(res) { res.on('data', function(chunk) { data +=

在一些领先的promise库(Q、Bluebird)中,progress处理程序已被弃用,并且也已从新的promise库中删除。虽然我理解取消进度事件背后的原因,但我很难重新考虑我已经非常习惯的以下模式:

var download = function(url) {
  var deferred = Q.defer();
  ...
  http.get(url, function(res) {
    res.on('data', function(chunk) {
      data += chunk.toString();
      deferred.notify('Downloading: ' + (data.length / totalLength) + '%'); 
      /* ^Notify download progress, but progress events are now deprecated :( */
    });
    res.on('end', function() {
      deferred.resolve('Success: ' + url);
    });
    res.on('error', function(err) {
      deferred.reject(err);
    });
  });
  return deferred.promise;
}
...
download(url).then(console.log, console.log, console.log); 
/* ^The third handler keeps logging progress, but this is now deprecated :( */
我在网络上到处都能看到代码重因子的例子,但在所有这些例子中,进度更新的数量似乎事先就知道了。在上面的模式中,可能发布的进度更新的数量是不确定的


有人能在不使用进度事件/处理程序的情况下帮助我实现上述模式吗?

进度的问题在于它与承诺是正交的,并且没有很好地组合。这样做的方式是从函数开始的

我的做法(你也可以在Bluebird API文档中阅读)大致如下:

var download = function(url, newData) {
  var deferred = Q.defer();
  ...
  http.get(url, function(res) {
    res.on('data', function(chunk) {
      data += chunk.toString();
      if(typeof newData === "function") newData(data);
    });
    res.on('end', function() {
      deferred.resolve('Success: ' + url);
    });
    res.on('error', function(err) {
      deferred.reject(err);
    });
  });
  return deferred.promise;
}
...
download(url, logOnNewData).then(log, log); 

另外请注意,您可以/应该使用promise构造函数来支持延迟,因为它是安全的。

太棒了!谢谢是的,我想重新考虑的原因之一是,我不必再使用延期付款。