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承诺转换为进度通知)与实际的核心问题(多个进度事件或流式)相比不是很好-一旦我弄明白了,我可能会制作一个新的规范