Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可观察的:链接承诺&;在每个承诺上触发事件_Javascript_Promise_Rxjs_Observable - Fatal编程技术网

Javascript 可观察的:链接承诺&;在每个承诺上触发事件

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));

我刚读到这个问题,有一个问题

设置与上述问题相同:我有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));
 };
根据答案,我把他们锁起来,就像这样:

 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);