国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS異步那些事 一 (基礎知識)

李濤 / 427人閱讀

摘要:異步那些事一基礎知識異步那些事二分布式事件異步那些事三異步那些事四異步那些事五異步腳本加載事件概念異步回調首先了講講中兩個方法和定義和用法方法用于在指定的毫秒數后調用函數或計算表達式。功能在事件循環的下一次循環中調用回調函數。

JS異步那些事 一 (基礎知識)
JS異步那些事 二 (分布式事件)
JS異步那些事 三 (Promise)
JS異步那些事 四(HTML 5 Web Workers)
JS異步那些事 五 (異步腳本加載)

js事件概念 異步回調:

首先了講講js中 兩個方法 setTimeout()和 setInterval()

定義和用法:
setTimeout() 方法用于在指定的毫秒數后調用函數或計算表達式。
語法:
setTimeout(callback,time)

callback 必需。要調用的函數后要執行的 JavaScript 代碼串。
time 必需。在執行代碼前需等待的毫秒數。

setInterval() 方法和setTimeout很相似,可按照指定的周期(以毫秒計)來調用函數或計算表達式。


比如上述代碼就是可以每隔1000毫秒延遲執行timecount函數,不同的是后者是周期的執行timecount函數,
SetInterval為自動重復,setTimeout不會重復。

線程阻塞

JavaScript引擎是單線程運行的,瀏覽器無論在什么時候都只且只有一個線程在運行JavaScript程序.

執行上述代碼,可以發現,總的運行時間幾乎要6秒多,因為是單線程,會在while循環里面消耗5秒的時間,然后才去執行settimeout函數。

隊列

瀏覽器是基于一個事件循環的模型,在這里面,可以有多個任務隊列,比如render是一個隊列,響應用戶輸入是一個,script執行是一個。任務隊列里放的是任務,同一個任務來源的任務肯定在同一個任務隊列里。任務有優先級,鼠標或鍵盤響應事件優先級高,大概是其他任務的3倍。

而我們常用的setTimeout函數,其本質上也就是向這個任務隊列添加回調函數,JavaScript引擎一直等待著任務隊列中任務的到來.由于單線程關系,這些任務得進行排隊,一個接著一個被引擎處理.

如果隊列非空,引擎就從隊列頭取出一個任務,直到該任務處理完,即返回后引擎接著運行下一個任務,在任務沒返回前隊列中的其它任務是沒法被執行的.

異步函數類型 異步IO:

首先來看看很典型的一個例子 ajax

異步計時:

setTimeout,setInterval都是基于事件驅動型的,通常瀏覽器不會給這個太快的速度,一般是200次/秒,效率太低了是吧如果遇到有密集型的運算的話,那就呵呵了。但是在node.js中還有process.nextTick()這個強大的東西,運行的速度將近10萬次/秒,很可觀。

process.nextTick(callback)

功能:在事件循環的下一次循環中調用 callback 回調函數。效果是將一個函數推遲到代碼書寫的下一個同步方法執行完畢時或異步方法的事件回調函數開始執行時;與setTimeout(fn, 0) 函數的功能類似,但它的效率高多了。

基于node.js的事件循環分析,每一次循環就是一次tick,每一次tick時,v8引擎從事件隊列中取出所有事件依次進行處理,如果遇到nextTick事件,則將其加入到事件隊尾,等待下一次tick到來時執行;造成的結果是,nextTick事件被延遲執行;

nextTick的確是把某任務放在隊列的最后(array.push)
nodejs在執行任務時,會一次性把隊列中所有任務都拿出來,依次執行
如果全部順利完成,則刪除剛才取出的所有任務,等待下一次執行
如果中途出錯,則刪除已經完成的任務和出錯的任務,等待下次執行
如果第一個就出錯,則throw error

下面看一下應用場景(包含計算密集型操作,將其進行遞歸處理,而不阻塞進程):

var http = require("http");
var wait = function (mils) {
    var now = new Date;
    while (new Date - now <= mils);
};
function compute() {
    // performs complicated calculations continuously
    console.log("start computing");
    wait(1000);
    console.log("working for 1s, nexttick");
    process.nextTick(compute);
}
http.createServer(function (req, res) {
    console.log("new request");
    res.writeHead(200, {"Content-Type": "text/plain"});
    res.end("Hello World");
}).listen(5000, "127.0.0.1");
compute();
異步錯誤處理 異步異常的特點

由于js的回調異步特性,無法通過try catch來捕捉所有的異常:

try {
  process.nextTick(function () {
      foo.bar();
  });
} catch (err) {
  //can not catch it
}

而對于web服務而言,其實是非常希望這樣的:

//express風格的路由
app.get("/index", function (req, res) {
  try {
    //業務邏輯
  } catch (err) {
    logger.error(err);
    res.statusCode = 500;
    return res.json({success: false, message: "服務器異常"});
  }
});

如果try catch能夠捕獲所有的異常,這樣我們可以在代碼出現一些非預期的錯誤時,能夠記錄下錯誤的同時,友好的給調用者返回一個500錯誤??上В瑃ry catch無法捕獲異步中的異常。
難道我們就這樣放棄了么? 其實還有一個辦法

onerror事件

我們一般通過函數名傳遞的方式(引用的方式)將要執行的操作函數傳遞給onerror事件,如

window.onerror=reportError;
window.onerror=function(){alert("error")}

但我們可能不知道該事件觸發時還帶有三個默認的參數,他們分別是錯誤信息,錯誤頁面的url和錯誤行號。

 
嵌套式回調的解嵌套

JavaScript中最常見的反模式做法是,回調內部再嵌套回調。

 

這里定義了一個異步函數checkPassword,它觸發了另一個異步函數db.query,而后者又可能觸發另外一個異步函數hash。它能用,而且簡潔明了。但是,如果試圖向其添加新特性,它就會變得毛里毛躁、險象環生,比如去處理那個數據庫錯誤,而不是拋出錯誤、記錄嘗試訪問數據庫的次數、阻塞訪問數據庫,等等。
下面我們換一種寫法,雖然這種寫法很啰嗦但是可讀性更高而且更易擴展。

 

在平時寫嵌套時,我們應該盡量避免多層嵌套,不然中間某個地方出錯了將會導致你投入更多的時間去debug。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/87756.html

相關文章

  • JS異步那些 四(HTML 5 Web Workers)

    摘要:向添加一個事件監聽器當傳遞消息時,會執行事件監聽器中的代碼。終止當我們創建對象后,它會繼續監聽消息即使在外部腳本完成之后直到其被終止為止。 JS異步那些事 一 (基礎知識)JS異步那些事 二 (分布式事件)JS異步那些事 三 (Promise)JS異步那些事 四(HTML 5 Web Workers)JS異步那些事 五 (異步腳本加載) 什么是 Web Worker? 當在 HTML ...

    ZoomQuiet 評論0 收藏0
  • JS異步那些 三 (Promise)

    摘要:異常處理異常處理一直是回調的難題,而提供了非常方便的方法在一次調用中,任何的環節發生,都可以在最終的中捕獲到錯誤處理基本的小結具體的很多的用法可以參考阮一峰的入門教程,還有就是上面提到的電子書。 JS異步那些事 一 (基礎知識)JS異步那些事 二 (分布式事件)JS異步那些事 三 (Promise)JS異步那些事 四(HTML 5 Web Workers)JS異步那些事 五 (異步腳本...

    wenzi 評論0 收藏0
  • JS異步那些 五 (異步腳本加載)

    摘要:遵循的是異步模塊定義規范,遵循的是通用模塊定義規范。不同的腳本加載這個模塊,得到的都是同一個實例。關于異步那些事就寫到這里了,很多地方理解的不夠深刻希望大家多多指教。 JS異步那些事 一 (基礎知識)JS異步那些事 二 (分布式事件)JS異步那些事 三 (Promise)JS異步那些事 四(HTML 5 Web Workers)JS異步那些事 五 (異步腳本加載) 異步腳本加載 阻塞性...

    terasum 評論0 收藏0
  • 2018 淺談前端面試那些

    摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。 雖然今年沒有換工作的打算 但為了跟上時代的腳步 還是忍不住整理了一份最新前端知識點 知識點匯總 1.HTML HTML5新特性,語義化瀏覽器的標準模式和怪異模式xhtml和html的區別使用data-的好處meta標簽canvasHTML廢棄的標簽IE6 bug,和一些定位寫法css js放置位置和原因...

    LiuRhoRamen 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<