我們知道Observable包裝的數(shù)據(jù)既可以是同步的也可以是異步的详囤,所以作為消費(fèi)者的Observer來(lái)說(shuō),它還充當(dāng)了回調(diào)的角色镐作,這和使用推數(shù)據(jù)的機(jī)制相吻合藏姐,因?yàn)槲覀儾恢繢OM事件何時(shí)發(fā)生,AJAX請(qǐng)求何時(shí)返回该贾。Observable使用Observer的next()函數(shù)來(lái)推送數(shù)據(jù)給Observer羔杨。使用這種方式的靈感來(lái)自迭代器和觀察者設(shè)計(jì)模式。迭代器不知道它所迭代的數(shù)據(jù)量大小杨蛋,只知道是否還有數(shù)據(jù)需要處理兜材。通過(guò)使用和迭代器類(lèi)似的api(請(qǐng)參看ES6的Generator和Iterator),Observable可以發(fā)送通知給它的訂閱者是否有事件發(fā)生逞力,這使得我們可以靈活地控制Observer可以接收到什么樣的數(shù)據(jù)曙寡。
當(dāng)我們調(diào)用Observable的subscribe()函數(shù)時(shí),一個(gè)Observer就被創(chuàng)建出來(lái)寇荧。Observer暴露了三個(gè)函數(shù):next举庶,complete,error揩抡。Observer的結(jié)構(gòu)如下:
let observer = {
next: function() {},
error: function() {},
complete: function() {}
}
在之前的演示代碼中户侥,我們?cè)趕ubscribe中使用的箭頭函數(shù)對(duì)應(yīng)的是next函數(shù),也就是說(shuō)這三個(gè)函數(shù)是可選擇使用的峦嗤。下面我們來(lái)解釋下這三個(gè)函數(shù)都干什么事兒蕊唐。
next(value):void
Observer將收到Observable發(fā)送的事件(值),這和觀察者模式中的update方法一樣烁设。如果我們傳給subscribe的參數(shù)是一個(gè)函數(shù)而不是Observer對(duì)象的話刃泌,那么就對(duì)應(yīng)next函數(shù)(subscribe有很多重載函數(shù))。
complete():void
Observer將收到Observable發(fā)送的完成消息。之后再調(diào)用next函數(shù)將被忽略耙替。
error(exception):void
Observer將收到Observable發(fā)送的錯(cuò)誤消息亚侠。含義是出現(xiàn)了異常將不再發(fā)送后續(xù)事件(即后續(xù)的next調(diào)用將被忽略)。錯(cuò)誤對(duì)象被當(dāng)做參數(shù)傳遞到error函數(shù)中俗扇,你也可以自定義傳遞給它的參數(shù)硝烂。
我們用以上函數(shù)就可以自定義創(chuàng)建一個(gè)Observable。