似乎我應該通過谷歌搜索找到答案,但我做不到,所以我在這里。
假設我有這個代碼:
const something = async (): Promise<void> => {
return new Promise<void>((resolve, _reject) => {
setTimeout(resolve, 500);
});
};
const s = new Subject<number>();
s.subscribe(async (n) => {
await something();
console.log(n);
});
s.subscribe(async (n) => {
await something();
console.log(n 1);
});
s.next(1);
是保證始終輸出的代碼
1
2
按照那個確切的順序?好吧,事實證明它可能會輸出,因為兩個 Promise 都有 500 毫秒的延遲,但不能保證。事實上,如果我將代碼更改為:
const something = async (): Promise<number> => {
return new Promise<number>((resolve, _reject) => {
const waitFor = Math.random() * 1000;
setTimeout(() => resolve(waitFor), waitFor);
});
};
const s = new Subject<number>();
s.subscribe(async (n) => {
const delay = await something();
console.log(n " / " delay);
});
s.subscribe(async (n) => {
const delay = await something();
console.log((n 1) " / " delay);
});
s.next(1);
然后您可以體驗第二個訂閱者有時會在第一個完成之前運行,這取決于每個訂閱者獲得的隨機延遲。
現在我需要訂閱者按照他們訂閱的順序運行,但我不能提供阻塞回呼,因為我的回呼必須是async為了await任何事情。
有沒有辦法讓 Observable 在呼叫下一個訂閱者之前等待每個訂閱者?
uj5u.com熱心網友回復:
這里的實際誤解是,您認為 observables 會使用subscribe呼叫的回傳值做一些事情,但事實并非如此。
在 observables() 的函式原始碼中可以看到subscribe(next: (value: T) => void): Subscription;,這個函式應該是一個 void 函式。將您的函式定義為async基本上回傳一個promise,observable 不使用該promise。因此,observable 也不會等待任何訂閱完成。
似乎您正試圖濫用可觀察物件的預期資訊流(嚴格從可觀察物件到訂閱者),以便將一些資訊回傳到流中。您將無法實作這一目標。
我建議您在問題中描述實際用例(如業務邏輯)。您可能會得到關于使用哪種rxjs運算子來達到預期結果的提示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/522083.html
標籤:打字稿异步等待rxjs
上一篇:帶有打字稿的多種型別
