簡單定義是可以將 Rxjs 理解為異步的 loDash
現(xiàn)在 web 的 5 個(gè)特征
- AJAX
- 用戶事件(單擊鬼癣、 鼠標(biāo)移動(dòng)存炮、鍵盤事件等)
- 動(dòng)畫
- sockets
- workers(任務(wù)/作業(yè))
回調(diào)
通常 javascript 會(huì)采用回調(diào)的方式來處理異步
getSomeData((data)=>{
console.log('接受數(shù)據(jù)',data);
});
回調(diào)問題顧名思義础爬,是我們所謂 callback Hell 也有叫做金子塔什么來的。就是層層嵌套看起來不舒服朴皆,當(dāng)然不僅僅是這些贴彼。
Promise 的出現(xiàn)可以讓代碼顯得更清晰易懂
getSomeData(id)
.then(data)=>{
console.log('接受數(shù)據(jù)',data);
return getSomeData(data.parentId);
})
.then( data => {
doStuff(data);
return getSomeData(data.parentId);
});
Promises 的特性
- 不可取消
- 不可變(immutable)
- 一次性返回(單值)
- 緩存
promise 的有些特性也是 promise 的缺點(diǎn)和問題所在缘薛,列出一下兩個(gè)問題
1. Promise 無法取消
我們經(jīng)常在線看一些視頻窍育,當(dāng)我們找到一個(gè)想看的視頻然后打開這個(gè)視頻,這時(shí)候就發(fā)起了一個(gè) Promise 的請求宴胧,但是隨后我們又發(fā)現(xiàn)一個(gè)更適合我們的視頻漱抓,隨后我們就打開了新的視頻以收看,這時(shí)候就又發(fā)起一個(gè) promise恕齐,由于 promise 是無法取消的所有前一個(gè) promise 還在進(jìn)行乞娄,這樣無形中就占用了我們的網(wǎng)絡(luò)資源。
我們需要一個(gè)類型是一個(gè)可以取消的異步
Promises 只能一次性返回單值
- AJAX(適合單值)
- 用戶事件(單擊檐迟、 鼠標(biāo)移動(dòng)补胚、鍵盤事件等)
- 動(dòng)畫
需要時(shí)時(shí)更新動(dòng)畫的狀態(tài) - sockets
- workers(作業(yè)/任務(wù))
我們需要的類型是可以異步返回一個(gè) iterable
Iterable
- iterable.iterator() 獲取 iterator
- iterator.next() 獲取結(jié)果
- result.value(): 返回值
- result.done 是否完成
- 在調(diào)用 iterator.next() 時(shí)可能會(huì)拋出一個(gè)錯(cuò)誤
const iterator = iterable.iterator();
while(true){
try {
let result = iterator.next();
} catch (error) {
handleError(err)
}
if(result.done){
break;
}
doSomething(result.value)
}