Javascript 可观察的:链接承诺&;在每个承诺上触发事件
我刚读到这个问题,有一个问题 设置与上述问题相同:我有3个承诺Javascript 可观察的:链接承诺&;在每个承诺上触发事件,javascript,promise,rxjs,observable,Javascript,Promise,Rxjs,Observable,我刚读到这个问题,有一个问题 设置与上述问题相同:我有3个承诺 const p1 = () => Promise.resolve(1); const p2 = x => { const val = x + 1; return Promise.resolve(val); }; const p3 = x => { const isEven = x => x % 2 === 0; return Promise.resolve(isEven(x));
const p1 = () => Promise.resolve(1);
const p2 = x => { const val = x + 1; return Promise.resolve(val); };
const p3 = x => {
const isEven = x => x % 2 === 0;
return Promise.resolve(isEven(x));
};
根据答案,我把他们锁起来,就像这样:
var chainedPromises$ =
Rx.Observable.just()
.flatMap(p1)
.flatMap(p2)
.flatMap(p3);
但是,chainedPromises$
仅在所有承诺链的末尾触发一次,解析值为true
。即:
chainedPromises$.subscribe(function(x){console.log(x)}); // Logs `true`
如何更改chainedPromises$,使其在每个承诺结束时触发一次?即:
chainedPromises$.subscribe(function(x){console.log(x)});
// Logs `1`
// Logs `2`
// Logs `true`
只是不要使用将一个值“映射”到另一个值的
mergeMap
,而使用仅在前一个可观察值完成时才订阅可观察值的concat
。通过这种方式,您将获得相同的效果,即您一次处理一个可观测值,但每个发射都将传播:
Observable.concat(p1, p2, p3)
.subscribe(console.log);
编辑:
这张照片是:
1
2
true
请看现场演示(开放式控制台):对我来说,你在这里浪费了整个可观察点 如果您希望订阅者以流的形式接收一组承诺,您只需将其传递到
next
,您现在也可以订阅流了
下面是一个例子。->
constp1=()=>Promise.resolve(1);
constp2=x=>{constval=x+1;返回Promise.resolve(val);};
常数p3=x=>{
常数isEven=x=>x%2==0;
返回承诺。解决(isEven(x));
};
常量chainedProm=(观察者)=>{
让params;
返回异步(p)=>
下一步(params=等待p(params));
};
var observable=Rx.observable.create(异步函数(观察者){
const doProm=链式PROM(观察者);
等待doProm(p1);
等待doProm(p2);
等待doProm(p3);
observer.complete();
});
subscribe(函数(x){console.log(x)})代码>
看起来您需要发出生成的值,并在链的下一步中使用它。我不知道这里面是否有糖,但我通过明确区分来实现
Observable
.fromPromise(p1())
.flatMap(val => Observable.merge(
Observable.fromPromise(p2(val))
.flatMap(val => Observable.merge(
Observable.fromPromise(p3(val)),
Observable.of(val)
)),
Observable.of(val)
))
.subscribe(console.log);
你可以看到工作。可观察和承诺不是一回事,你在这里试图做的事情没有意义。如果您要生成一个可操作的返回多个结果,那么您可以使用next
触发它们。我猜您的意思是Rx.Observable.concat(p1(),p2(),p3())
?当链接承诺时,上一个承诺的值将发送到下一个承诺。Concat没有做到这一点。@amaurymartiny,这正是你想要的,对吗?@martin用Concat日志1
,Nan
,false
为例。我想要一个记录1
,2
,true
@amaurymartiny我听过一条关于可观察性的主要规则,不要尝试将它们用于所有事情async/await
更适合您的要求。有没有更具声明性的方法来实现这一点?我现在还更新了一个实用程序函数,名为,chainedProm
您可以用于任何可观察到的,如果您希望得到承诺链。
Observable
.fromPromise(p1())
.flatMap(val => Observable.merge(
Observable.fromPromise(p2(val))
.flatMap(val => Observable.merge(
Observable.fromPromise(p3(val)),
Observable.of(val)
)),
Observable.of(val)
))
.subscribe(console.log);