switchMap Обещание Обещания не работает - PullRequest
0 голосов
/ 26 сентября 2018

environment:

  • rxjs6
  • es6

Я пишу функцию "getStatus $", чтобы смоделировать асинхронное обещание, и превратил его внаблюдаемый.

Когда я подписываюсь, он работает нормально.

Но я помещаю его в трубу, он не работает.

В чем проблема?

Как это исправить?

Спасибо ~

const { from, interval } = rxjs
const { switchMap } = rxjs.operators

const getStatus$ = () => from(new Promise(res => {
	setTimeout(() => {
  	res('zdl')
  }, 1000);
}));
// 1s
// 'first zdl'
// It works
getStatus$().subscribe(str => console.log('first', str));

// It doesn't work
// nothing output
interval(1000).pipe(
  switchMap(getStatus$)
).subscribe(str => console.log('second', str));
<script src="https://cdn.bootcss.com/rxjs/6.2.0/rxjs.umd.min.js"></script>

Благодаря Fan Cheung , двумя способами:

interval(1000).pipe(
  mergeMap(getStatus$)
).subscribe(str => console.log('second', str));
// or
const getStatus$ = () => from(new Promise(res => {
    setTimeout(() => {
    res('zdl')
  }, 500);
}));

1 Ответ

0 голосов
/ 27 сентября 2018

Благодаря Fan Cheung , двумя способами:

метод 1, используйте оператор mergeMap для замены switchMap:

const { from, interval } = rxjs
const { mergeMap } = rxjs.operators

const getStatus$ = () => from(new Promise(res => {
	setTimeout(() => {
  	res('zdl')
  }, 1000);
}));

interval(1000).pipe(
  mergeMap(getStatus$)
).subscribe(str => console.log('second', str));
<script src="https://cdn.bootcss.com/rxjs/6.2.0/rxjs.umd.min.js"></script>

метод 2, сделать getStatus$ время короче interval, я изменяю его на 500 мс:

const { from, interval } = rxjs
const { switchMap } = rxjs.operators

const getStatus$ = () => from(new Promise(res => {
	setTimeout(() => {
  	res('zdl')
  }, 500);
}));

interval(1000).pipe(
  switchMap(getStatus$)
).subscribe(str => console.log('second', str));
<script src="https://cdn.bootcss.com/rxjs/6.2.0/rxjs.umd.min.js"></script>
...