我想创建一个可观察的对象,从中将值推送给观察者。
问题在于,这些值是通过调用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();
}
}
});
答案 0 :(得分:1)
大多数使用可观察值的可观察运算符也可以使用promise。因此,您可以通过concatMap
和defer
获得所需的内容:
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;
});