我在理解以下兩個片段之間的區別時遇到了一些問題。
const a = Observable.create(
o => {
setTimeout(
()=>{
console.log("now 3");
o.next(3);
setTimeout(()=>{ console.log("and now 5"); o.next(5)}, 1500);}
, 1500);
}
);
const a2 = Observable.create(
o => {
setTimeout(
()=>{
console.log("here is 4");
o.next(4);
setTimeout(o.next(6), 1500);}
, 1500);
}
);
https://stackblitz.com/edit/rxjs-byqgnh?devtoolsheight=60
我在第二個塊中只洗掉了控制臺日志。
第一個塊按預期作業:超時后發出第一個數字,第二個數字也是。
第二個塊同時發出兩個數字。有人能解釋一下區別嗎?
uj5u.com熱心網友回復:
當你做
setTimeout(()=>{ console.log("and now 5"); o.next(5)}, 1500);
您將()=>{ console.log("and now 5"); o.next(5)}作為回呼函式傳遞給setTimeout API,這可能會在1.5sec. 這很好,因為這就是你想要發生的事情。
但是當你這樣做時
setTimeout(o.next(6), 1500)
在將o.next(6)值作為回呼函式傳遞給 之前,您正在執行和發出值setTimeout,但是當您看到它不是函式簽名時,o.next(6)生成的是一個undefined將作為回呼傳遞的值,并且您可能會Callback must be a function出錯。
因此,如果您想 o.next(6)作為回呼函式傳遞給 setTimeout 并在 1.5 秒后發出值,那么您可以將其傳遞為
setTimeout(() => o.next(6), 1500)
或作為
setTimeout(function(){
o.next(6);
}, 1500)
uj5u.com熱心網友回復:
setTimeout 需要回呼
以下與生成運行時錯誤
setTimeout(o.next(6), 1500);
TypeError [ERR_INVALID_CALLBACK]: Callback must be a function.
因為 n.next 的回傳型別是未定義的。然而,Observables 會捕獲錯誤并將它們作為錯誤事件發送給您。所以你在你的例子中看不到這一點。
要解決此問題,您可以setTimeout改為提供回呼函式。
setTimeout(() => o.next(6), 1500);
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318792.html
標籤:javascript 异步 rxjs
