【问题标题】:How can I subscribe to a promise using rx.js?如何使用 rxjs 订阅 Promise?
【发布时间】:2014-07-31 14:37:25
【问题描述】:

我有一个返回承诺的函数。
我想使用 rx.js 订阅该承诺,调用此函数会将通知推送给所有订阅者。

这是我所拥有的:

var subject = new Rx.Subject();

var subscription = subject.subscribe(
    function (x) { console.log('onNext: ' + x); },
    function (e) { console.log('onError: ' + e.message); },
    function () { console.log('onCompleted'); }
);

//here I want to push first notification
subject.fromPromise(functionThatReturnsPromise()); 

//some code

//here I want to push second notification
subject.fromPromise(functionThatReturnsPromise()); 

因此订阅者只收到一个通知。

如何解决?

【问题讨论】:

    标签: javascript rxjs


    【解决方案1】:
    var subject = new Rx.Subject();
    
    var subscription = subject.mergeAll().subscribe(
        function (x) { console.log('onNext: ' + x); },
        function (e) { console.log('onError: ' + e.message); },
        function () { console.log('onCompleted'); }
    );
    
    subject.onNext(Rx.Observable.fromPromise(functionThatReturnsPromise()));
    
    //some code
    
    subject.onNext(Rx.Observable.fromPromise(functionThatReturnsPromise()));
    

    这里的主题现在是一个元流(一个可观察的可观察对象)。在订阅它之前,我们通过调用mergeAll() 来“扁平化”它。在 onNext() 上,我们将 Observables 提供给主题,这就是它成为元流的原因。

    【讨论】:

    • 请注意,promise 解析的顺序在这里可能很重要。在处理类似问题时,两个关键点是使用mergeAll(1) 限制并发,并使用Observable.defer() 而不是Observable.fromPromise() 以确保可能的承诺链将一次性执行。更多细节在这里stackoverflow.com/questions/38815109/…
    猜你喜欢
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多