观察者功能中的异步等待

时间:2019-11-21 18:43:41

标签: angular typescript promise rxjs observable

我想创建一个可观察的对象,从中将值推送给观察者。

问题在于,这些值是通过调用promise-returning方法获得的。

是否有一种方法可以在可观察对象内调用promise-returning函数,例如以下伪代码(该伪代码不起作用,因为我无法标记传递给可观察对象异步的函数)... < / p>

return new Observable((observer) => {

  let counter = 0;

  for(...)
  {
    try
    {
      const value = await promisefunction(counter++);
                    ^^^^^
      observer.next(value);
    }
    catch(error)
    {
      observer.complete();
    }
  }

});

1 个答案:

答案 0 :(得分:1)

大多数使用可观察值的可观察运算符也可以使用promise。因此,您可以通过concatMapdefer获得所需的内容:

const observable = of(arrayOfObjects).pipe(
    concatMap((object, i) => defer(() => promiseFunction(object, i))
)

我们使用defer来推迟实际执行promisefunction(并“开始”承诺)直到之前的承诺完成。因此,上述构造将一次一次依次执行该功能,就像您尝试使用异步for循环一样。

编辑:您也可以这样操作:

const observable = new Observable(observer => {
  let canceled = false;
  let count = 0;

  async function engine() {
    try {
      while (!canceled) {
        const value = await promiseFunction(++count);
        observer.next(value);
      }
    }
    catch (e) {
      observer.error(e);
    }
  }

  engine();
  return () => canceled = true;
});