我喜歡在繼續 log- ready之前決議我的 Observable res$ 。但我發現沒有辦法做到這一點。我無法將我的最后一個日志行移到異步背景關系中。有沒有辦法解決這個問題?
let o1 = Observable.create((o) => {
console.log('o1 start');
setTimeout(() => {
console.log(`o1 is running`);
o.next('o1');
}, 1500);
console.log('o1 ends');
});
let o2 = Observable.create((o) => {
console.log('o2 starts');
setTimeout(() => {
console.log(`o2 is running`);
o.next('o2');
}, 1100);
console.log('o2 ends');
});
let res$ = o1.pipe(concatMap(() => o2)).subscribe();
//ToDO resolve res$ before continue execution
console.log(`ready`);
https://stackblitz.com/edit/rxjs-b9z3wn?devtoolsheight=60
uj5u.com熱心網友回復:
有沒有辦法解決這個問題?
簡而言之:不,這是不可能的。
JavaScript 是一種單頭語言。異步代碼都在同一個執行緒上運行,因此 JavaScript 代碼的兩部分永遠不會同時運行。
這有一些優點。例如,您很少需要擔心互斥鎖、信號量等。使用 JavaScript,您可以確定所有同步代碼將在運行任何其他代碼之前運行完成。
但是,有一個缺點,不可能將異步背景關系提升為同步背景關系。任何這樣做的嘗試都不會停止(就像撰寫無限回圈時程式失敗的方式)。這就是 Node.js 因回呼地獄而臭名昭著的原因(對于舊代碼仍然如此)。它在很大程度上依賴于將回呼推到事件回圈上,因為它不允許等待。Promises 和 Observables 是管理這種復雜性的兩種方法。
JavaScript 是單執行緒的。所以如果你等待 10 秒鐘,整個程式將掛起 10 秒鐘,什么也不做。如果您嘗試等待其他事情發生,單執行緒將永遠忙于等待,因此忙于去做它正在等待的事情。
uj5u.com熱心網友回復:
您可以將 Observable 轉換為 a Promise,await然后再將其轉換。嘗試這個:
await o1.pipe(concatMap(() => o2)).toPromise()
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318787.html
