使用 RxJS 链接 promise [英] Chaining promises with RxJS

查看:20
本文介绍了使用 RxJS 链接 promise的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

总的来说,我是 RxJS 和 FRP 的新手.我的想法是将 ExpressJS 应用程序中现有的承诺链转换为可观察的实践.我知道这可能不是最好的例子,但也许有人可以帮助阐明.

I'm new to RxJS and FRP in general. I had the idea of converting an existing promise chain in my ExpressJS application to be an observable for practice. I am aware that this probably isn't the best example but maybe someone can help shed some light.

我正在做的事情:

  1. 我有两个承诺 - prom1 和 prom2
  2. 我希望 prom1 在 prom2 之前运行
  3. 如果 prom1 发送一个拒绝(错误),我想在它开始之前取消 prom2.
  4. 我希望 prom1 返回的错误消息可用于观察者的 onError 方法.

<小时>

var prom1 = new Promise(function(resolve, reject) {
    if (true) {
       reject('reason');
    }
    resolve(true);
});

var prom2 = new Promise(function(resolve, reject) {
    resolve(true);
});

// What do I do here? This is what I've tried so far...
var source1 = Rx.Observable.fromPromise(prom1);
var source2 = source1.flatMap(Rx.Observable.fromPromise(prom2));

var subscription = source2.subscribe(
    function (result) { console.log('Next: ' + result); },

    // I want my error 'reason' to be made available here
    function (err) { console.log('Error: ' + err); },

    function () { console.log('Completed'); });

推荐答案

如果我理解你想要做什么 - 你需要从返回 promise 的函数中创建两个延迟的 observable 并将它们连接起来:

If I understood what you are trying to do - you need to create two deferred observables from functions that return promises and concat them:

var shouldFail = false;

function action1() {
    return new Promise(function (resolve, reject) {    
        console.log('start action1');
        if (shouldFail) {
            reject('reason');
        }
        resolve(true);
    });
}

function action2() {
    return new Promise(function (resolve, reject) {    
        console.log('start action2');
        resolve(true);
    });
}

var source1 = Rx.Observable.defer(action1);
var source2 = Rx.Observable.defer(action2);

var combination = Rx.Observable.concat(source1, source2);

var logObserver = Rx.Observer.create(

function (result) {
    console.log('Next: ' + result);
},

function (err) {
    console.log('Error: ' + err);
},

function () {
    console.log('Completed');
});

然后对于正常情况:

combination.subscribe(logObserver);
// start action1
// Next: true
// start action2
// Next: true
// Completed

以及第一个承诺失败的情况:

And case where fisrt promise fails:

shouldFail = true;
combination.subscribe(logObserver);
// start action1
// Error: reason

http://jsfiddle.net/cL37tgva/

这篇关于使用 RxJS 链接 promise的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆