国产精品尤物福利片在线观看_少妇免费毛片久久久久久久久_久久久久成人精品免费播放动漫_日韩av综合在线观看

歡迎來到010在線作文網!

研究Promise 方式實現Node.js 實踐應用論文

實用文 時間:2021-08-31 手機版

  Node.js 是建立在Chrome V8 引擎的javaScript 運行時之上的平臺, 用于構建快速、可擴展的Web 應用程序. Node.js 采用單線程、事件驅動、非阻塞的I/O模型, 這些特性不僅帶來了巨大的性能提升, 還減少了多線程程序設計的復雜性, 進而提高了開發效率,使其輕量又高效. 傳統的Node.js 在處理異步問題時,一般采用的是callback 回調的方式. callback 回調存在一個很嚴重的金字塔問題——大量的回調函數慢慢向右側屏幕延伸的一種狀態.

研究Promise 方式實現Node.js 實踐應用論文

  Promise 是異步編程的一種解決方案, 比傳統的解決方案——回調函數和事件, 更合理和強大. 它最早由javascript 社區提出和實現, 目前最新的JavaScript語言標準ES6 已將其寫進了標準中, 統一了用法, 原生提供了Promise 對象. 借助Promise 對象, 可以將異步操作以同步操作的流程表達出來, 避免了層層嵌套的回調函數.

  本文就是采用Promise 方式在Node.js 平臺上搭建了一個網絡爬蟲的應用. 本文首先介紹了Node.js 平臺以及其相關的一些特點和概念, 然后在此基礎上, 針對其傳統的callback 的回調方式的“回調地獄”等問題,引入了Promise 對象來處理這種異步回調的問題. 通過深入分析Promise 對象的理論知識以及規范, 將其合理地運用到網絡爬蟲的應用中去. 最后通過爬取一個課程網站的視頻課程信息, 充分展示了Node.js 平臺的強大和方便, 以及Promise 對象在處理異步回調問題上的優越性以及新思路.

  1.Node.js平臺介紹

  Node.js 是一位叫Ryan Dahl 的程序員發明的. 他的工作是用C/C++寫高性能Web 服務. 對于高性能,異步IO、事件驅動是基本原則, 但是用C/C++寫就太痛苦了. 于是Ryan 開始設想用高級語言開發Web 服務.他評估了很多種高級語言, 發現很多語言雖然同時提供了同步IO 和異步IO, 但是開發人員一旦用了同步IO, 他們就再也懶得寫異步IO 了, 所以, 最終, Ryan瞄向了JavaScript. 因為JavaScript 是單線程執行, 根本不能進行同步IO 操作, 所以, JavaScript 的這一“缺陷”導致了它只能使用異步IO.

  選定了開發語言, 還要有運行時引擎. Ryan 曾考慮過自己寫一個, 不過明智地放棄了, 因為V8 就是開源的JavaScript 引擎. 讓Google 投資去優化V8, 我們只管拿過來用就好了.于是在2009 年, Ryan 正式推出了基于JavaScript語言和V8 引擎的開源Web 服務器項目, 命名為Node.js. Node 第一次把JavaScript 帶入到后端服務器開發, 加上世界上已經有無數的JavaScript 開發人員,所以Node.js 一下子就火了起來.Node.js 主要特點是(1)時間驅動、異步編程; (2)單進程單線程.

  1.1 事件驅動、異步編程

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

  1.2 單進程單線程

  1.2.1 高性能

  Node.js 單線程模式避免了傳統php 那樣頻繁創建、切換線程的花銷, 執行速度更快. 而且, 資源占用小, Node.js 在大負荷下對內存占用任然很低.

  1.2.2 線程安全

  單線程的node.js 還保證了絕對的線程安全, 不用擔心統一變量同時被多個線程進行讀寫而造成程序崩潰. 線程安全的同時也解放了開發人員, 免去了多線程編程中忘記對變量加鎖或者解鎖造成的隱患.

  2.Promise

  Promise 主要解決JavaScript 中異步的場景.Promise 是個對象, 同JavaScript 中其它對象沒什么區別, 但同時它也是一個規范, 針對異步操作約定了統一的接口, 表示一個一步操作最終的結果, 以同步的方式來寫代碼, 執行的操作是異步的, 但是又保證程序的執行順序是同步的. 這原本是JavaScript 社區的一個規范的構想, 現在已經被加入到了ES6 的語言標準中, Firefox 和Chrome 等瀏覽器已經對它進行了實現.

  2.1 同步與異步

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

  2.2 Promise 對象的狀態

  Promise 對象只有三種狀態:

  (1) Pending: 初始狀態, 進行中.

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

  (3) Rejected: 失敗的操作.

  (1) Promise 對象的狀態不受外界影響.

  Promise 對象代表一個異步操作, 有三種狀態:Pending(進行中)、Resolved(已完成, 又稱Fulfilled)和Rejected(已失敗). 只有異步操作的結果, 可以決定當前是哪一種狀態, 任何其他操作都無法改變這個狀態.

  (2) Promise 對象一旦狀態改變, 就不會再變, 任何時候都可以得到這個結果.Promise 對象的狀態改變, 只有兩種可能: 從Pending 變為Resolved 和從Pending 變為Rejected. 只要這兩種情況發生, 狀態就凝固了, 不會再變了, 會一直保持這個結果. 就算改變已經發生了, 再對Promise 對象添加回調函數, 也會立即得到這個結果.

  2.3 Promise 的核心方法

  Promise 對象的核心部件是它的then 方法, 它的作用是為Promise 實例添加狀態改變時的回調函數. then方法接受兩個回調函數作為參數. 第一個回調函數是Promise 對象的狀態變為Resolved 時調用, 第二個回調函數是Promise 對象的狀態變為Rejected 時調用. 其中,第二個函數是可選的, 不一定要提供. 這兩個函數都接受Promise 對象傳出的值作為參數.Promise 對象另一個核心方法是它的catch 方法,用于指定發生錯誤時的回調函數, 是then(null,rejection)的別名. catch 方法可以捕捉promise 實例中的異常還能捕獲在它之前太狠方法中發生的異常, 所以在實際的使用中, 多用catch 方法來取代then(null,rejection)處理異常.

  3.爬蟲應用設計與實現

  3.1 模塊加載

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

  3.2 組織數據結構

  首先在chrome 瀏覽器中打開需要爬取的網頁, 同時打開控制臺查看網頁html DOM 結構, 分析出所需信息, 組織好數據結構, 然后根據DOM結構去獲取所需信息.

  3.3 Promise 主要流程

  本例中完成的主要功能是, 同時爬取一個課程網站的多個頁面, 獲取相關信息, 然后將數據按照組織好的數據結構打印出來.代碼中所用到的Promise.all 方法用于將多個Promise 實例, 包裝成一個新的Promise 實例.該方法接收一個Promise 對象數組作為參數, p1、p2、p3 都是Promise 對象的實例.p 的狀態由p1、p2、p3 決定, 分成兩種情況.

  (1) 只有p1、p2、p3 的狀態都變成Resolved, p 的狀態才會變成Resolved, 此時p1、p2、p3 的返回值組成一個數組, 傳遞給p 的回調函數.

  (2) 只要p1、p2、p3 之中有一個被rejected, p 的狀態就變成Rejected, 此時第一個被Rejected 的實例的返回值, 會傳遞給p 的回調函數.

  3.4 相關函數實現

  3.4.1 爬取頁面getPageAsync(url)

  通過http 模塊的get 方法爬取頁面數據, 最后返回一個Promise 對象, 方便異步處理.

  3.4.2 過濾數據filterChapters(html)

  過濾出每個頁面所需的數據, 然后按一定的數據結構組織起來.

  3.4.3 打印數據printCourseInfo(coursesData)

  將爬取到的數據, 按照組織好的數據結構打印出來.

  3.4 實驗結果

  執行promise_crawler.js 文件, 即可看到輸出的相關信息實驗中同爬取了4 個頁面, 可以看到, 實驗結果是按照代碼中設定好的數據結構爬取并打印出來的,符合實驗預期. Promise 對象是基于異步的方式來處理程序的. 爬取每個頁面時, 不用等待頁面的數據處理完畢再去爬取下一個頁面, 而是無阻塞不間斷的去爬取每個頁面, 當有異步的數據返回時調用Promise 對象的resolve()方法去處理, 出現錯誤異常時調用reject()方法去解決. 當有多個Promise 對象時, 調用then(onFulfilled)方法, 同步處理每個Promise 對象, 一旦處理哪個Promise 對象出錯時, 可以立即調用catch方法處理異常, 中止程序往下執行, 及時發現錯誤.而且onFulfilled()方法每次返回的是新的Promise 對象,這樣保證了then()可以一直鏈式調用下去, 提高了程序的效率和可靠性.

  4.結語

  Node.js 作為一門新興的技術, 打通了前后端的界限. 由于采用事件驅動和無阻塞模型, 可以很方便的構建高效、可擴展的網絡應用, 這是Node.js 最大的一個優點, 同時也是最大的一個缺點, 由于事件驅動和無阻塞模型是建立在callback 這種回調方式上的, 隨著回調的增加, 代碼嵌套的層次就會增加, 這樣很容易陷入“回調地獄”, 這種代碼難以編寫, 難以理解而且難以維護.Promise 對象是解決Node.js 中異步回調的一種很有效的方式. 借助Promise 對象, 可以將異步操作以同步操作的流程表達出來, 避免了層層嵌套的回調函數.在保證異步回調的基礎上又實現了多個promise 對象之間的同步順序, 使程序能快速高效的執行下去, 給我們的開發帶來很大的便利.


本文來源http://www.nvnqwx.com/shiyongwen/1557013.htm
以上內容來自互聯網,請自行判斷內容的正確性。若本站收錄的信息無意侵犯了貴司版權,請給我們來信(zaixianzuowenhezi@gmail.com),我們會及時處理和回復,謝謝.
国产精品尤物福利片在线观看_少妇免费毛片久久久久久久久_久久久久成人精品免费播放动漫_日韩av综合在线观看
国产日产欧美精品| 日韩电影天堂视频一区二区| 亚洲成人午夜在线| 国产视频99| 国产精品毛片va一区二区三区| 午夜精品视频在线观看一区二区| 国产乱人伦精品一区二区 | 91精品久久久久久久久久久久久久 | 亚洲va久久久噜噜噜| 国产欧美日韩综合精品二区 | 中文字幕不卡每日更新1区2区| 欧美日韩国产精品一区二区| 色婷婷综合成人| 日本精品视频在线观看| 91|九色|视频| 少妇大叫太大太粗太爽了a片小说| 99久久99久久精品国产片| 一级黄色免费在线观看| 成人免费视频91| 综合操久久久| 99视频免费播放| 亚洲永久一区二区三区在线| 成人av.网址在线网站| 欧美日韩国产va另类| 分分操这里只有精品| 伊人久久在线观看| 99在线观看视频网站| 五月天在线免费视频| 久久精品欧美| 欧美做暖暖视频| 国产精品乱码久久久久| 国产日韩欧美中文| 亚洲欧洲另类精品久久综合| 久久免费成人精品视频| 人人妻人人澡人人爽欧美一区双| 久久久精品国产| 国内精品久久久久久久果冻传媒| 久久在线精品视频| 成人欧美一区二区三区黑人免费| 午夜精品久久久99热福利| 久久福利一区二区| 欧美在线免费观看| 国产精品免费看久久久无码| 国产一区二区中文字幕免费看| 欧美人与物videos| 91老司机精品视频| 日本精品免费| 久久精品国产亚洲精品2020| 国产在线精品一区二区三区》| 一区二区三区一级片| 国产精品10p综合二区| 欧美日韩国产综合在线| 久久在线免费观看视频| 91精品国产高清久久久久久91裸体| 日本欧美黄网站| 精品久久久久久一区二区里番| 成人久久久久爱| 日本精品免费观看| 欧美精品免费在线| 久久免费一区| 国产视频99| 欧美一级淫片播放口| 国产精品国产三级国产专区53| 国产精品一区二区三区在线| 肉大捧一出免费观看网站在线播放 | 欧美精品一区在线| 伊人久久婷婷色综合98网| 久久9精品区-无套内射无码| 国产一区二区三区四区五区加勒比 | 欧美日本精品在线| 九色91国产| 国产一区二区免费电影| 日本一区精品| 欧美激情精品久久久久| 久久久久久久爱| 国产区精品在线观看| 日本阿v视频在线观看| 国产99久久精品一区二区永久免费| 国产精品av免费观看| 国产在线观看福利| 日韩美女在线观看一区| 中文字幕久久一区| 国产精品无码专区av在线播放| 91久久精品美女| 国产淫片免费看| 欧美一区激情视频在线观看 | 国产噜噜噜噜噜久久久久久久久| 欧美精品一区二区三区久久 | 欧美久久在线| 欧美一级日本a级v片| 中文字幕日韩精品一区二区| 久久精品福利视频| 国产成人精品a视频一区www| 99亚洲精品视频| 国产免费一区二区三区在线观看| 欧美视频小说| 日韩精品一区二区免费| 成人做爰www免费看视频网站| 一区二区三区四区欧美| 精品久久久久亚洲| 另类色图亚洲色图| 国产精品久久网| 国产a级片网站| 91精品久久久久久| av动漫在线看| www日韩在线观看| 国产伦理久久久| 国产人妻777人伦精品hd| 国产在线观看91精品一区| 黄色网络在线观看| 欧美日韩在线不卡一区| 欧美综合第一页| 欧美性天天影院| 欧美日韩电影一区二区三区| 欧日韩不卡在线视频| 欧美在线一二三区| 欧美视频小说| 欧美日韩精品一区| 欧美尤物一区| 欧美视频在线观看视频| 欧美精品免费观看二区| 青草成人免费视频| 欧美日韩国产综合视频在线| 欧美自拍大量在线观看| 欧美中文字幕在线观看| 欧美交换配乱吟粗大25p| 女女同性女同一区二区三区按摩| 欧美亚洲国产视频| 国内精品久久国产| 国产日韩在线免费| 国产乱淫av片杨贵妃| 成人精品视频在线播放| 国产精品一二三在线| 成人av中文| 91高清免费视频| 国产成人短视频| 色老头一区二区三区| 久久九九亚洲综合| 国产精品成人在线| 精品自拍视频在线观看| 一区二区三区在线视频看| 亚洲欧美日韩精品在线| 日本精品一区二区| 精品人妻少妇一区二区| 国产一区二区自拍| 91精品国产91久久久久麻豆 主演| 久色视频在线播放| 久久久久久久久久久久久久国产 | 亚洲乱码一区二区三区三上悠亚| 无码播放一区二区三区| 日韩欧美在线观看强乱免费| 欧美精品卡一卡二| 国产老熟妇精品观看| 久久综合九色综合网站| 日韩中文字幕在线观看| 国产精品激情自拍| 国产99久久精品一区二区 | 蜜臀久久99精品久久久久久宅男| 亚洲国产成人不卡| 欧美在线www| 国产乱子伦精品| 久久观看最新视频| 国产精品高潮粉嫩av| 亚洲欧美影院| 男女午夜激情视频| 国产情侣av自拍| 蜜臀av性久久久久蜜臀av| 国产日本欧美一区二区三区在线| 日韩人妻精品无码一区二区三区| 亚洲国产一区二区三区在线| 亚洲乱码中文字幕久久孕妇黑人| 亚洲综合在线小说| 欧美一级片中文字幕| 黄色一级片播放| 成人久久一区二区| 国产精品视频一区国模私拍 | 精品不卡一区二区三区| 亚洲va欧美va在线观看| 欧美日韩在线不卡视频| 91久久国产精品91久久性色| 按摩亚洲人久久| 亚洲综合视频一区| 国内精品在线一区| av在线观看地址| 国产精品视频一区国模私拍| 亚洲精品人成| 毛片一区二区三区四区| 久久天天狠狠| 中文字幕日韩精品久久| 黄色污污在线观看| 久久www免费人成精品| 中文一区一区三区免费| 欧美精品国产精品久久久| 久久综合婷婷综合| 一区二区三区久久网| 国模精品系列视频| 色偷偷9999www| 日韩在线电影一区| 国产一级片91| 国产精品青青草|