Rx JS startsWith()运算符可解决Promise的结果吗?

时间:2019-06-24 10:52:56

标签: angular rxjs rxjs6

将RxJs运算符问题视为

//emit (1,2,3)
const source = Rx.Observable.of(1,2,3);
//start with 0
const example =  source.startWith(0);
//output: 0,1,2,3
const subscribe = example.subscribe(val => console.log(val));

现在,我希望 startWith()是Promise的结果。

// - 1
var pr = new Promise((res, rej) => {
  setTimeout(() => res(-1), 1000);
});

在“预订”错误块中捕获的承诺错误。

最终输出应类似于

-1, 1, 2, 3

--------------------------------------------------- -

尝试1:我试图兑现诺言,但没有解决。

const example =  source.startWith(pr);

尝试2::我尝试使用异步等待,但被try catch块卡住了。

2 个答案:

答案 0 :(得分:1)

您可以使用concat()。在类似情况下对我来说效果很好。

import { concat, of } from 'rxjs';

const promise = new Promise((resolve, reject) => /* process and resolve */);

const observable = of(1, 2, 3).pipe(
    /* Pipe whatever operator you need, but don't use `startWith()` */
);

const subscription = concat(promise, observable).subscribe(...);
  

⚠注意concat是从rxjs(不是rxjs/operators)导入的。

     

⚠仅在observable开始发射后才应用管道。如果您想对诺言应用任何管道,则必须用from将其包装,如下所示:from(promise)


TLDR-它如何工作?

concat接收现有流(可观察/承诺/可迭代...),并顺序发出它们的值。每个流必须在下一个流开始发射之前完成。

所以...本质上,您获得的信息流是:

  • 已解决的承诺值
  • 1
  • 2
  • 3


concat上的示例和文档:

Official docs

Learn RxJs


欢呼和快乐编码?

答案 1 :(得分:0)

您有两个Observables,source和sourceAdd

const source = Rx.Observable.of(1,2,3);
const sourceAdd;
yourPromise.then(res=>{
   sourceAdd=source.pipe(startWith(res));
   sourceAdd.subscribe(res=>{
   })
}