色噜噜人体337p人体 I 超碰97观看 I 91久久香蕉国产日韩欧美9色 I 色婷婷我要去我去也 I 日本午夜a I 国产av高清怡春院 I 桃色精品 I 91香蕉国产 I 另类小说第一页 I 日操夜夜操 I 久久性色 I 日韩欧在线 I 国产深夜在线观看 I 免费的av I 18在线观看视频 I 他也色在线视频 I 亚洲熟女中文字幕男人总站 I 亚洲国产综合精品中文第一 I 人妻丰满熟av无码区hd I 新黄色网址 I 国产精品真实灌醉女在线播放 I 欧美巨大荫蒂茸毛毛人妖 I 国产一区欧美 I 欧洲亚洲1卡二卡三卡2021 I 国产亚洲欧美在线观看三区 I 97精品无人区乱码在线观看 I 欧美妇人 I 96精品在线视频 I 国产人免费视频在线观看 I 91麻豆国产福利在线观看

研究Promise 方式實(shí)現(xiàn)Node.js 實(shí)踐應(yīng)用論文

時(shí)間:2021-04-15 09:58:47 論文 我要投稿

研究Promise 方式實(shí)現(xiàn)Node.js 實(shí)踐應(yīng)用論文

  Node.js 是建立在Chrome V8 引擎的javaScript 運(yùn)行時(shí)之上的平臺(tái), 用于構(gòu)建快速、可擴(kuò)展的Web 應(yīng)用程序. Node.js 采用單線程、事件驅(qū)動(dòng)、非阻塞的I/O模型, 這些特性不僅帶來(lái)了巨大的性能提升, 還減少了多線程程序設(shè)計(jì)的復(fù)雜性, 進(jìn)而提高了開(kāi)發(fā)效率,使其輕量又高效. 傳統(tǒng)的Node.js 在處理異步問(wèn)題時(shí),一般采用的是callback 回調(diào)的方式. callback 回調(diào)存在一個(gè)很?chē)?yán)重的金字塔問(wèn)題——大量的回調(diào)函數(shù)慢慢向右側(cè)屏幕延伸的一種狀態(tài).

研究Promise 方式實(shí)現(xiàn)Node.js 實(shí)踐應(yīng)用論文

  Promise 是異步編程的一種解決方案, 比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件, 更合理和強(qiáng)大. 它最早由javascript 社區(qū)提出和實(shí)現(xiàn), 目前最新的JavaScript語(yǔ)言標(biāo)準(zhǔn)ES6 已將其寫(xiě)進(jìn)了標(biāo)準(zhǔn)中, 統(tǒng)一了用法, 原生提供了Promise 對(duì)象. 借助Promise 對(duì)象, 可以將異步操作以同步操作的流程表達(dá)出來(lái), 避免了層層嵌套的回調(diào)函數(shù).

  本文就是采用Promise 方式在Node.js 平臺(tái)上搭建了一個(gè)網(wǎng)絡(luò)爬蟲(chóng)的應(yīng)用. 本文首先介紹了Node.js 平臺(tái)以及其相關(guān)的一些特點(diǎn)和概念, 然后在此基礎(chǔ)上, 針對(duì)其傳統(tǒng)的callback 的回調(diào)方式的“回調(diào)地獄”等問(wèn)題,引入了Promise 對(duì)象來(lái)處理這種異步回調(diào)的問(wèn)題. 通過(guò)深入分析Promise 對(duì)象的理論知識(shí)以及規(guī)范, 將其合理地運(yùn)用到網(wǎng)絡(luò)爬蟲(chóng)的應(yīng)用中去. 最后通過(guò)爬取一個(gè)課程網(wǎng)站的視頻課程信息, 充分展示了Node.js 平臺(tái)的強(qiáng)大和方便, 以及Promise 對(duì)象在處理異步回調(diào)問(wèn)題上的優(yōu)越性以及新思路.

  1.Node.js平臺(tái)介紹

  Node.js 是一位叫Ryan Dahl 的程序員發(fā)明的. 他的工作是用C/C++寫(xiě)高性能Web 服務(wù). 對(duì)于高性能,異步IO、事件驅(qū)動(dòng)是基本原則, 但是用C/C++寫(xiě)就太痛苦了. 于是Ryan 開(kāi)始設(shè)想用高級(jí)語(yǔ)言開(kāi)發(fā)Web 服務(wù).他評(píng)估了很多種高級(jí)語(yǔ)言, 發(fā)現(xiàn)很多語(yǔ)言雖然同時(shí)提供了同步IO 和異步IO, 但是開(kāi)發(fā)人員一旦用了同步IO, 他們就再也懶得寫(xiě)異步IO 了, 所以, 最終, Ryan瞄向了JavaScript. 因?yàn)镴avaScript 是單線程執(zhí)行, 根本不能進(jìn)行同步IO 操作, 所以, JavaScript 的這一“缺陷”導(dǎo)致了它只能使用異步IO.

  選定了開(kāi)發(fā)語(yǔ)言, 還要有運(yùn)行時(shí)引擎. Ryan 曾考慮過(guò)自己寫(xiě)一個(gè), 不過(guò)明智地放棄了, 因?yàn)閂8 就是開(kāi)源的JavaScript 引擎. 讓Google 投資去優(yōu)化V8, 我們只管拿過(guò)來(lái)用就好了.于是在2009 年, Ryan 正式推出了基于JavaScript語(yǔ)言和V8 引擎的開(kāi)源Web 服務(wù)器項(xiàng)目, 命名為Node.js. Node 第一次把JavaScript 帶入到后端服務(wù)器開(kāi)發(fā), 加上世界上已經(jīng)有無(wú)數(shù)的JavaScript 開(kāi)發(fā)人員,所以Node.js 一下子就火了起來(lái).Node.js 主要特點(diǎn)是(1)時(shí)間驅(qū)動(dòng)、異步編程; (2)單進(jìn)程單線程.

  1.1 事件驅(qū)動(dòng)、異步編程

  事件驅(qū)動(dòng)并不是Node.js 專(zhuān)屬, 在某些傳統(tǒng)語(yǔ)言的網(wǎng)絡(luò)編程中, 我們會(huì)用到回調(diào)函數(shù), 比如當(dāng)socket 資源達(dá)到某種狀態(tài)時(shí), 注冊(cè)的回調(diào)函數(shù)就會(huì)執(zhí)行.Node.js 的設(shè)計(jì)思想中以事件驅(qū)動(dòng)為核心, 它提供的絕大多數(shù)API 都是基于事件的、異步的風(fēng)格. 以Net 模塊為例, 其中的net.Socket 對(duì)象就有以下事件:connect、data、end、timeout、drain、error、close 等, 使用Node.js 的開(kāi)發(fā)人員需要根據(jù)自己的業(yè)務(wù)邏輯注冊(cè)相應(yīng)的回調(diào)函數(shù). 這些回調(diào)函數(shù)都是異步執(zhí)行的, 這意味著雖然在代碼結(jié)構(gòu)中, 這些函數(shù)看似是依次注冊(cè)的, 但是它們并不依賴于自身出現(xiàn)的順序, 而是等待相應(yīng)的事件觸發(fā). 事件驅(qū)動(dòng)、異步編程的設(shè)計(jì)重要的優(yōu)勢(shì)在于, 充分利用了系統(tǒng)資源, 執(zhí)行代碼無(wú)須阻塞等待某種操作完成, 有限的資源可以用于其他的任務(wù).此類(lèi)設(shè)計(jì)非常適合于后端的網(wǎng)絡(luò)服務(wù)編程, Node.js 的目標(biāo)也在于此. 在服務(wù)器開(kāi)發(fā)中, 并發(fā)的請(qǐng)求處理是個(gè)大問(wèn)題, 阻塞式的函數(shù)會(huì)導(dǎo)致資源浪費(fèi)和時(shí)間延遲.通過(guò)事件注冊(cè)、異步函數(shù), 開(kāi)發(fā)人員可以提高資源的利用率, 性能也會(huì)改善.從Node.js 提供的支持模塊中, 我們可以看到包括文件操作在內(nèi)的許多函數(shù)都是異步執(zhí)行的, 這和傳統(tǒng)語(yǔ)言存在區(qū)別, 而且為了方便服務(wù)器開(kāi)發(fā), Node.js 的網(wǎng)絡(luò)模塊特別多, 包括HTTP、DNS、NET、UDP、HTTPS、TLS 等, 開(kāi)發(fā)人員可以在此基礎(chǔ)上快速構(gòu)建Web 服務(wù)器.

  1.2 單進(jìn)程單線程

  1.2.1 高性能

  Node.js 單線程模式避免了傳統(tǒng)php 那樣頻繁創(chuàng)建、切換線程的花銷(xiāo), 執(zhí)行速度更快. 而且, 資源占用小, Node.js 在大負(fù)荷下對(duì)內(nèi)存占用任然很低.

  1.2.2 線程安全

  單線程的node.js 還保證了絕對(duì)的線程安全, 不用擔(dān)心統(tǒng)一變量同時(shí)被多個(gè)線程進(jìn)行讀寫(xiě)而造成程序崩潰. 線程安全的同時(shí)也解放了開(kāi)發(fā)人員, 免去了多線程編程中忘記對(duì)變量加鎖或者解鎖造成的隱患.

  2.Promise

  Promise 主要解決JavaScript 中異步的場(chǎng)景.Promise 是個(gè)對(duì)象, 同JavaScript 中其它對(duì)象沒(méi)什么區(qū)別, 但同時(shí)它也是一個(gè)規(guī)范, 針對(duì)異步操作約定了統(tǒng)一的接口, 表示一個(gè)一步操作最終的結(jié)果, 以同步的方式來(lái)寫(xiě)代碼, 執(zhí)行的操作是異步的, 但是又保證程序的執(zhí)行順序是同步的. 這原本是JavaScript 社區(qū)的一個(gè)規(guī)范的構(gòu)想, 現(xiàn)在已經(jīng)被加入到了ES6 的語(yǔ)言標(biāo)準(zhǔn)中, Firefox 和Chrome 等瀏覽器已經(jīng)對(duì)它進(jìn)行了實(shí)現(xiàn).

  2.1 同步與異步

  JS 引擎是單線程的. 這意味著在任何環(huán)境中, 只有一段JS 代碼會(huì)被執(zhí)行. 每個(gè)函數(shù)是一個(gè)不可分割的片段或者代碼塊. 當(dāng)JS 引擎開(kāi)始執(zhí)行一個(gè)函數(shù)(比如回調(diào)函數(shù))時(shí), 它就會(huì)把這個(gè)函數(shù)執(zhí)行完, 只有執(zhí)行完這段代碼才會(huì)繼續(xù)執(zhí)行后面的代碼. 這就是JS 中的同步. Promise 對(duì)象的then()方法就是同步處理每個(gè)Promise 對(duì)象.異步是指在執(zhí)行一段代碼時(shí), 這段代碼依賴一些其他的操作或者數(shù)據(jù), 這時(shí)就不用等待數(shù)據(jù)或者操作的返回, 直接執(zhí)行下一段代碼, 當(dāng)有數(shù)據(jù)或操作返回時(shí)再去響應(yīng)之前的代碼, 從而提高代碼執(zhí)行的效率.

  2.2 Promise 對(duì)象的狀態(tài)

  Promise 對(duì)象只有三種狀態(tài):

  (1) Pending: 初始狀態(tài), 進(jìn)行中.

  (2) Resolved(或Fulfilled): 成功的操作.

  (3) Rejected: 失敗的操作.

  (1) Promise 對(duì)象的狀態(tài)不受外界影響.

  Promise 對(duì)象代表一個(gè)異步操作, 有三種狀態(tài):Pending(進(jìn)行中)、Resolved(已完成, 又稱Fulfilled)和Rejected(已失敗). 只有異步操作的結(jié)果, 可以決定當(dāng)前是哪一種狀態(tài), 任何其他操作都無(wú)法改變這個(gè)狀態(tài).

  (2) Promise 對(duì)象一旦狀態(tài)改變, 就不會(huì)再變, 任何時(shí)候都可以得到這個(gè)結(jié)果.Promise 對(duì)象的狀態(tài)改變, 只有兩種可能: 從Pending 變?yōu)镽esolved 和從Pending 變?yōu)镽ejected. 只要這兩種情況發(fā)生, 狀態(tài)就凝固了, 不會(huì)再變了, 會(huì)一直保持這個(gè)結(jié)果. 就算改變已經(jīng)發(fā)生了, 再對(duì)Promise 對(duì)象添加回調(diào)函數(shù), 也會(huì)立即得到這個(gè)結(jié)果.

  2.3 Promise 的核心方法

  Promise 對(duì)象的核心部件是它的then 方法, 它的作用是為Promise 實(shí)例添加狀態(tài)改變時(shí)的回調(diào)函數(shù). then方法接受兩個(gè)回調(diào)函數(shù)作為參數(shù). 第一個(gè)回調(diào)函數(shù)是Promise 對(duì)象的狀態(tài)變?yōu)镽esolved 時(shí)調(diào)用, 第二個(gè)回調(diào)函數(shù)是Promise 對(duì)象的狀態(tài)變?yōu)镽ejected 時(shí)調(diào)用. 其中,第二個(gè)函數(shù)是可選的, 不一定要提供. 這兩個(gè)函數(shù)都接受Promise 對(duì)象傳出的值作為參數(shù).Promise 對(duì)象另一個(gè)核心方法是它的catch 方法,用于指定發(fā)生錯(cuò)誤時(shí)的回調(diào)函數(shù), 是then(null,rejection)的別名. catch 方法可以捕捉promise 實(shí)例中的異常還能捕獲在它之前太狠方法中發(fā)生的異常, 所以在實(shí)際的使用中, 多用catch 方法來(lái)取代then(null,rejection)處理異常.

  3.爬蟲(chóng)應(yīng)用設(shè)計(jì)與實(shí)現(xiàn)

  3.1 模塊加載

  新建一個(gè)promise_crawler.js 文件, 首先把需要的相應(yīng)的模塊加載進(jìn)來(lái).http 模塊: 主要用于搭建 HTTP 服務(wù)端和客戶端,使用 HTTP 服務(wù)器或客戶端功能必須調(diào)用 http 模塊;bluebird 模塊: Promise 類(lèi)庫(kù)(在最新的Node.js 里已經(jīng)引入了Promise 模塊, 可直接使用, 但考慮到兼容性問(wèn)題, 本例中采用bluebird 模塊);cheerio 模塊: 類(lèi)似于前端的jQuery, 能夠簡(jiǎn)單方便地操作裝在后臺(tái)的html.

  3.2 組織數(shù)據(jù)結(jié)構(gòu)

  首先在chrome 瀏覽器中打開(kāi)需要爬取的網(wǎng)頁(yè), 同時(shí)打開(kāi)控制臺(tái)查看網(wǎng)頁(yè)html DOM 結(jié)構(gòu), 分析出所需信息, 組織好數(shù)據(jù)結(jié)構(gòu), 然后根據(jù)DOM結(jié)構(gòu)去獲取所需信息.

  3.3 Promise 主要流程

  本例中完成的主要功能是, 同時(shí)爬取一個(gè)課程網(wǎng)站的多個(gè)頁(yè)面, 獲取相關(guān)信息, 然后將數(shù)據(jù)按照組織好的數(shù)據(jù)結(jié)構(gòu)打印出來(lái).代碼中所用到的Promise.all 方法用于將多個(gè)Promise 實(shí)例, 包裝成一個(gè)新的Promise 實(shí)例.該方法接收一個(gè)Promise 對(duì)象數(shù)組作為參數(shù), p1、p2、p3 都是Promise 對(duì)象的實(shí)例.p 的狀態(tài)由p1、p2、p3 決定, 分成兩種情況.

  (1) 只有p1、p2、p3 的狀態(tài)都變成Resolved, p 的狀態(tài)才會(huì)變成Resolved, 此時(shí)p1、p2、p3 的返回值組成一個(gè)數(shù)組, 傳遞給p 的回調(diào)函數(shù).

  (2) 只要p1、p2、p3 之中有一個(gè)被rejected, p 的狀態(tài)就變成Rejected, 此時(shí)第一個(gè)被Rejected 的實(shí)例的返回值, 會(huì)傳遞給p 的回調(diào)函數(shù).

  3.4 相關(guān)函數(shù)實(shí)現(xiàn)

  3.4.1 爬取頁(yè)面getPageAsync(url)

  通過(guò)http 模塊的get 方法爬取頁(yè)面數(shù)據(jù), 最后返回一個(gè)Promise 對(duì)象, 方便異步處理.

  3.4.2 過(guò)濾數(shù)據(jù)filterChapters(html)

  過(guò)濾出每個(gè)頁(yè)面所需的`數(shù)據(jù), 然后按一定的數(shù)據(jù)結(jié)構(gòu)組織起來(lái).

  3.4.3 打印數(shù)據(jù)printCourseInfo(coursesData)

  將爬取到的數(shù)據(jù), 按照組織好的數(shù)據(jù)結(jié)構(gòu)打印出來(lái).

  3.4 實(shí)驗(yàn)結(jié)果

  執(zhí)行promise_crawler.js 文件, 即可看到輸出的相關(guān)信息實(shí)驗(yàn)中同爬取了4 個(gè)頁(yè)面, 可以看到, 實(shí)驗(yàn)結(jié)果是按照代碼中設(shè)定好的數(shù)據(jù)結(jié)構(gòu)爬取并打印出來(lái)的,符合實(shí)驗(yàn)預(yù)期. Promise 對(duì)象是基于異步的方式來(lái)處理程序的. 爬取每個(gè)頁(yè)面時(shí), 不用等待頁(yè)面的數(shù)據(jù)處理完畢再去爬取下一個(gè)頁(yè)面, 而是無(wú)阻塞不間斷的去爬取每個(gè)頁(yè)面, 當(dāng)有異步的數(shù)據(jù)返回時(shí)調(diào)用Promise 對(duì)象的resolve()方法去處理, 出現(xiàn)錯(cuò)誤異常時(shí)調(diào)用reject()方法去解決. 當(dāng)有多個(gè)Promise 對(duì)象時(shí), 調(diào)用then(onFulfilled)方法, 同步處理每個(gè)Promise 對(duì)象, 一旦處理哪個(gè)Promise 對(duì)象出錯(cuò)時(shí), 可以立即調(diào)用catch方法處理異常, 中止程序往下執(zhí)行, 及時(shí)發(fā)現(xiàn)錯(cuò)誤.而且onFulfilled()方法每次返回的是新的Promise 對(duì)象,這樣保證了then()可以一直鏈?zhǔn)秸{(diào)用下去, 提高了程序的效率和可靠性.

  4.結(jié)語(yǔ)

  Node.js 作為一門(mén)新興的技術(shù), 打通了前后端的界限. 由于采用事件驅(qū)動(dòng)和無(wú)阻塞模型, 可以很方便的構(gòu)建高效、可擴(kuò)展的網(wǎng)絡(luò)應(yīng)用, 這是Node.js 最大的一個(gè)優(yōu)點(diǎn), 同時(shí)也是最大的一個(gè)缺點(diǎn), 由于事件驅(qū)動(dòng)和無(wú)阻塞模型是建立在callback 這種回調(diào)方式上的, 隨著回調(diào)的增加, 代碼嵌套的層次就會(huì)增加, 這樣很容易陷入“回調(diào)地獄”, 這種代碼難以編寫(xiě), 難以理解而且難以維護(hù).Promise 對(duì)象是解決Node.js 中異步回調(diào)的一種很有效的方式. 借助Promise 對(duì)象, 可以將異步操作以同步操作的流程表達(dá)出來(lái), 避免了層層嵌套的回調(diào)函數(shù).在保證異步回調(diào)的基礎(chǔ)上又實(shí)現(xiàn)了多個(gè)promise 對(duì)象之間的同步順序, 使程序能快速高效的執(zhí)行下去, 給我們的開(kāi)發(fā)帶來(lái)很大的便利.

【研究Promise 方式實(shí)現(xiàn)Node.js 實(shí)踐應(yīng)用論文】相關(guān)文章:

培養(yǎng)高職學(xué)生主動(dòng)意識(shí)的實(shí)踐與探索的方式研究論文12-11

自我傳播的途徑與方式研究論文11-03

轉(zhuǎn)變農(nóng)業(yè)發(fā)展方式研究論文05-23

中職學(xué)生行為方式研究論文06-18

關(guān)于PLC實(shí)現(xiàn)高爐料流閥自修正控制的研究與應(yīng)用的論文07-18

預(yù)防醫(yī)學(xué)實(shí)踐教學(xué)改革的應(yīng)用研究論文07-31

Proteus在電子實(shí)踐教學(xué)課程中應(yīng)用的研究論文01-23

網(wǎng)站設(shè)計(jì)的實(shí)現(xiàn)技術(shù)研究論文10-24

無(wú)線通信SCADA系統(tǒng)的實(shí)現(xiàn)與應(yīng)用論文07-08

主站蜘蛛池模板: 爱视频一区二区三区 | 欧美性色大片在线观看 | 日本人又黄又爽又大又色 | 韩国精品视频一区二区在线播放 | 日韩美女乱淫免费看视频大黄 | 一区二区不卡在线 | 日韩一区二区福利 | 国产乱叫456 | 久久精品5 | 亚洲精品88欧美一区二区 | 亚洲97| 高清国产一区二区 | 亚洲成人av在线看 | 国产香蕉视频在线 | 日本精品视频免费观看 | 最新av在线 | av免费无码天堂在线 | 男人添女人呻吟吃奶视频免费 | 激情网站在线 | 国内大量揄拍人妻在线视频 | 福利视频不卡 | 久久精品人妻无码一区二区三区 | 亚洲精品97久久中文字幕无码 | 成人永久免费福利视频免费 | 精品一区二区三区香蕉蜜桃 | 蜜桃网站入口可看18禁 | 欧美粗大猛烈老熟妇 | 国产做无码视频在线观看浪潮 | 亚洲国产精品色婷婷 | 真实国产乱子伦精品一区二区三区 | 夜夜嗨aⅴ免费视频 | 欧美成人在线网站 | 亚洲第一成年网 | 国产三级全黄 | 未满十八勿入午夜免费网站 | 亚洲日韩欧洲无码a∨夜夜 国产成人久久av免费看 | 肉嫁高柳家在线看 | 免费午夜视频在线观看 | 中国一级女人毛片 | 国产成人亚洲综合无码精品 | 激情春色网 | 中文字幕视频观看 | 无码人妻精品一区二区三区免费 | 日本欧洲亚洲高清在线 | 国产美女视频免费的 | 无人区乱码一区二区三区 | 欧美日本乱大交xxxxx | 欧美精品在线一区 | 精品日韩在线观看 | 国产午夜精品无码 | 锦绣未央在线观看免费版西瓜 | 性欧美极品xxxx欧美一区二区 | 国产一性一爱一乱一交 | 欧美成人一二三区 | 五月天婷婷小说网 | 黑色丝袜吻戏亲胸摸腿 | 亚洲在线视频一区二区 | 国产又粗又猛又爽又黄的视频免费 | 激情综合久久 | 蕾丝av无码专区在线观看 | 国产一区二区三级 | √最新版天堂资源网在线 | 91精品国产91久久久久青草 | 天天射久久| 欧美日韩三区二区 | 日文字体乱码一二三四最新 | 欧美午夜激情影院 | 欧美一级日韩片 | 久草国产在线观看 | 性色av闺蜜一区二区三区 | 国产精品粉嫩懂色av | 丰满少妇大力进入av亚洲 | 亚洲综合成人婷婷小说 | 一边摸一边做爽的免费视频日本 | 欧美97| 在线亚洲精品 | 高清视频在线免费观看 | 日本亚洲欧美高清专区vr专区 | 五月色婷婷六月噜噜 | 狠狠色噜噜狠狠狠狠色综合久av | 夜夜高潮天天爽欧美国产亚洲一区 | 国产综合视频一区二区三区 | 免费看特级毛片 | 日韩欧美一区二区三区视频 | 免费观看黄频视 | 日韩精品久久久久久久电影蜜臀 | 在线观看国产福利 | 黄色大毛片| 一级黄色录像在线观看 | 影音先锋中文字幕在线 | 九月激情婷婷 | www.嫩草蜜桃 | 午夜大尺度视频 | 国产伦精品一区二区三区照片91 | 亚洲天堂网在线观看 | 黄又色又污又爽又高潮 | 草草影院在线观看视频 | 午夜av福利 | 网站在线你懂的 |