gpt4 book ai didi

javascript - promise : Refactoring Progress when the number of progress updates is unknown

转载 作者:行者123 更新时间:2023-11-30 05:30:56 28 4
gpt4 key购买 nike

进度处理程序已在一些领先的 ​​promise 库(QWhenBluebird)中弃用,并且也已从新的 Promises/A+ spec 中删除。虽然我理解取消进度事件背后的原因,但我在重构以下我已经习惯的模式时遇到了麻烦:

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 :( */

我已经看到网络上随处可见的代码重构示例,但在所有这些示例中,进度更新的数量似乎是事先已知的。在上面的模式中,可能发出的进度更新的数量是不确定的。

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

最佳答案

progress 的问题在于它与 promise 是正交的并且没有很好地组合。您将采用的方式来自函数。

我的做法(您也可以在 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 构造函数来支持 deferreds,因为它是抛出安全的。

关于javascript - promise : Refactoring Progress when the number of progress updates is unknown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27124110/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com