資源描述:
《nodejs實例講解》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、看看node.jschat程序如何實現(xiàn)Ajaxlong-polling長鏈接刷新模式前言 首先,關(guān)于node.js,這里就不再細(xì)說了?! ode.jschat是node.js作者用JS寫的一個多人聊天工具,源代碼公開下載,網(wǎng)址是chat.nodejs.org。作者用這個小例子,來展示如何用nodejs開發(fā)高效率的應(yīng)用程序。對于nodejs的學(xué)習(xí)者來說,是一個很好的例子?! U話不多說,開始今天的主題??v觀這個程序,感覺它的最可貴之處,在于展示了,如何用nodejs實現(xiàn)長鏈接模式的刷新技術(shù)?!?/p>
2、?。ㄟ@個程序不詳細(xì)介紹,重點講解這個功能)Client.js 首先看一段核心代碼:1functionlongPoll(data){23//....此處省略**行45$.ajax({cache:false6,type:"GET"7,url:"/recv"8,dataType:"json"9,data:{since:CONFIG.last_message_time,id:CONFIG.id}10,error:function(){11addMessage("","longpollerror.tryin
3、gagain...",newDate(),"error");12transmission_errors+=1;13//don'tfloodtheserversonerror,wait10secondsbeforeretrying14setTimeout(longPoll,10*1000);15}16,success:function(data){17transmission_errors=0;18//ifeverythingwentwell,beginanotherrequestimmediatel
4、y19//theserverwilltakealongtimetorespond20//howlong?well,itwillwaituntilthereisanothermessage21//andthenitwillreturnittousandclosetheconnection.22//sincetheconnectionisclosedwhenwegetdata,welongPollagain23longPoll(data);24}25});26} 這是client.js中的一段代碼,一
5、看這段代碼,大家應(yīng)該立馬想到兩個字——“遞歸”。在longPoll方法中,再次調(diào)用longPoll方法,典型的遞歸調(diào)用?! 「鶕?jù)這段代碼的語義,可以看出,第一次加載時,會調(diào)用longPoll方法,異步向"/resv"獲取值,如果成功了,執(zhí)行success的方法,立即再次調(diào)用longPoll方法。如果失敗了,執(zhí)行error函數(shù),隔10秒中再次調(diào)用longPoll方法。當(dāng)然,執(zhí)行error方法有一定的次數(shù)限制,由變量transmission_errorsx控制。 大家可能會有一個疑問,這樣一直遞歸循環(huán)
6、獲取數(shù)據(jù),服務(wù)器會不會有很大的負(fù)擔(dān)?在沒有數(shù)據(jù)可獲取的時候,也會一直這樣循環(huán)嗎?當(dāng)然,答案時否定的!并且,nodejs利用自身的特點,很好的處理了這個問題。接著往下看:Server.js現(xiàn)看server中如何回應(yīng)上面client的調(diào)用,核心代碼:1fu.get("/recv",function(req,res){23//對session的驗證和更新......45channel.query(since,function(messages){6if(session)session.poke();7re
7、s.simpleJSON(200,{messages:messages,rss:mem.rss});8});9}); 先不要管這個fu.get()是什么意思,它和本次教程無關(guān)??傊浪芑貞?yīng)client的調(diào)用就行了。上面的代碼,除了對session的一些操作之外,只是調(diào)用了channel的query方法。注意傳遞的參數(shù):·since,它紀(jì)錄了一個時間;·匿名方法,它接受一個messages參數(shù),兩個動作:1更新session時間,2返回一個json,即把messages返回給客戶端?! ∮腥丝赡?/p>
8、會有疑問:在這里直接返回messages不行嗎,干嘛還得在一個channel中定義一個方法才操作?答案:如果是那樣,就成了一個死循環(huán),server和client每時每刻都進行著數(shù)據(jù)交互,即使沒有信息可返回。 還是接著往下看吧! 看channel是怎么定義的:varMESSAGE_BACKLOG=200,SESSION_TIMEOUT=60*1000;varchannel=newfunction(){varmessages=[],callbacks=[];this.