Javascript ECMAScript Promise中的进度通知
我们使用的是Javascript ECMAScript Promise中的进度通知,javascript,promise,ecmascript-6,Javascript,Promise,Ecmascript 6,我们使用的是ECMAScript 6承诺 我们需要向最终用户实现进度通知(这是纯粹的UX需求)。我知道其他promise框架(qpromiselibrary,例如)允许这样做 我们如何才能最优雅地采用某种进度指示 或者我们应该迁移到另一个框架? (我不知道如何估计后者的努力)ES2015承诺永远不会有进展。承诺代表一种独特的最终价值。如果您想要多个值,您可以查看可观察值,或者将进度放在promise返回函数上 将进度放在承诺返回函数上相当容易。基本上,您将回调作为函数的参数,并在出现进度通知时调
ECMAScript 6承诺
我们需要向最终用户实现进度通知(这是纯粹的UX需求)。我知道其他promise框架(qpromise
library,例如)允许这样做
我们如何才能最优雅地采用某种进度指示
或者我们应该迁移到另一个框架?
(我不知道如何估计后者的努力)ES2015承诺永远不会有进展。承诺代表一种独特的最终价值。如果您想要多个值,您可以查看可观察值,或者将进度放在promise返回函数上 将进度放在承诺返回函数上相当容易。基本上,您将回调作为函数的参数,并在出现进度通知时调用它 以下是根据我们的指南改编的一些文本: Progression与使用promise Progression处理程序的API存在可组合性和链接问题。随着其他库离开ProgressionAPI,因为它实际上与承诺无关,Bluebird也将如此。实现进度条的通用用例可以使用类似于C#中的模式来完成 使用jQuery之前:
Promise.resolve($.get(...))
.progressed(function() {
// ...
})
.then(function() {
// ...
})
.catch(function(e) {
// ...
})
在以下情况下使用jQuery:
Promise.resolve($.get(...).progress(function() {
// ...
}))
.then(function() {
// ...
})
.catch(function(e) {
// ...
})
实现C#中的通用进度接口:
由于只有promise的特定实例才能产生进展,我们可以根据需要对其进行修补,如下所示:
function reparse(){
let notify
let promise = new Promise(async(resolve,reject)=>{
instanceOfjQueryDeferred.done(()=>{
resolve(100)
}).progress((progress)=>{
notify(progress)
})
})
// here is the monkey patch
promise.progress = (handler)=>{
notify = handler
return promise
}
return promise
}
reparse().progress((p)=>{
console.log('progress',p)
}).then((progress)=>{
console.log('done',progress)
})
然后像这样使用它:
function reparse(){
let notify
let promise = new Promise(async(resolve,reject)=>{
instanceOfjQueryDeferred.done(()=>{
resolve(100)
}).progress((progress)=>{
notify(progress)
})
})
// here is the monkey patch
promise.progress = (handler)=>{
notify = handler
return promise
}
return promise
}
reparse().progress((p)=>{
console.log('progress',p)
}).then((progress)=>{
console.log('done',progress)
})
2018年-使用一个异步生成器你想把它放在一个答案中,@benjamin?@Shog9我知道,但我不确定如何诚实,因为前提(将Q承诺转换为进度通知)与实际的核心问题(多个进度事件或流式)相比不是很好-一旦我弄明白了,我可能会制作一个新的规范