angular - async await trong hàm observer
Tôi muốn tạo một observable từ đó để đẩy các giá trị đến các observer của tôi.
Vấn đề là, những giá trị đó được lấy thông qua việc gọi một phương thức trả về promise.
Có cách nào để gọi await trên hàm trả về promise bên trong observable, giống như đoạn pseudo-code sau đây (mà không hoạt động, vì tôi không thể đánh dấu hàm được truyền vào observable là async)...
return new Observable((observer) => {
let counter = 0;
for(...)
{
try
{
const value = await promisefunction(counter++);
^^^^^
observer.next(value);
}
catch(error)
{
observer.complete();
}
}
});
Câu trả lời #1
Hầu hết các toán tử observable tiêu thụ một observable cũng có thể tiêu thụ một promise. Vì vậy, bạn có thể nhận được những gì bạn muốn thông qua concatMap và defer:
const observable = of(arrayOfObjects).pipe(
concatMap((object, i) => defer(() => promiseFunction(object, i))
)
Chúng tôi sử dụng defer để trì hoãn việc thực sự thực thi promisefunction (và "bắt đầu" promise) cho đến khi promise trước đó hoàn thành. Vì vậy, cấu trúc trên sẽ thực thi hàm theo thứ tự từng cái một, giống như bạn đang cố gắng làm với vòng lặp async của mình.
Chỉnh sửa: Bạn cũng có thể làm theo cách của mình như sau:
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;
});
