【发布时间】:2015-07-08 21:40:19
【问题描述】:
总的来说,我是 RxJS 和 FRP 的新手。我的想法是将我的 ExpressJS 应用程序中的现有承诺链转换为可观察的练习。我知道这可能不是最好的例子,但也许有人可以帮助阐明一下。
我想做的事:
- 我有两个承诺 - prom1 和 prom2
- 我希望 prom1 在 prom2 之前运行
- 如果 prom1 发送拒绝(错误),我想在 prom2 开始之前取消它。
- 我希望 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 不是“运行”的,它们不能被“启动”。什么意思?
-
你使用的是什么承诺库,原生承诺?它如何支持取消?
-
@Bergi - 我正在使用github.com/then/promise。当我说“运行”或“开始”时,我想这是我在创建可观察对象并向订阅者广播时的说法。
-
flatMap肯定会(就像then)接受一个回调,而不是一个可观察的(或分别的承诺)。 -
@Bergi - 看起来 flatMap() 确实接受了一个 observable。 xgrommx.github.io/rx-book/content/core_objects/observable/…。我错过了什么吗?我不是说 flatMap() 是答案,它只是我知道要尝试的唯一方法。这就是我需要帮助的原因。
标签: javascript observable frp rxjs