2013-05-17 98 views
1

JavaScript的突出特性之一(或者是不利的,取決於你對這個主題的看法)是異步性的。我理解代碼流的工作方式,但我並不是100%地表示異步代碼是「異步」的。什麼構成異步JavaScript?

當然,聯繫服務器或讀/寫數據庫是異步行爲。但是關於通常非異步處理的東西呢?我可以編寫使用回調的代碼,使它整天都是異步的。

同步實例

var arrayToIterate = [1,2,3,4,5,6,7,8,9, ... ] 
//Say this array length is in the hundreds of millions. 

var addArrayContents = function(array) { 
    var total = 0; 

    for (var i = 0, len = array.length; i <= len; i++) { 
     total = total + array[i]; 
    } 

    return total; 
}; 

var arrayTotal = addArrayContents(arrayToIterate); 

 

異步例

var arrayToIterate = [1,2,3,4,5,6,7,8,9, ... ] 
    //Say this array length is in the hundreds of millions. 

var addArrayContents = function(array, callback) { 

    var iterator = function(total, arIndex, cb) { 
     if (arIndex == array.length) { 
      return cb(total); 
     } 

     total = total + array[arIndex]; 
     arIndex++; 

     iterator(total, arIndex, cb) 
    }; 

    iterator(0, 0, callback); 
}; 

addArrayContents(arrayToIterate, function(result){ 
    console.log(result); 
    // Do stuff 
}); 

正如你所知道的,這兩個函數做同樣的事情,一個人的異步的,一個不是。在確定最佳時間同步執行異步操作時,有沒有經驗法則?在上面的例子中,當將這些數字加在一起時,同步函數會受到阻礙,而異步版本在運行時不會掛起。

我只是有一種感覺,我不會100%地理解異步性。看起來它不僅僅是看一個函數並找出它是否使用回調函數。

+2

async的第二個例子是什麼?它只是在完成時調用一個回調函數 – adeneo

+4

僅僅傳遞函數並不是使運行時系統異步的東西,而是事件調度系統的存在以及使用它來宣佈的外部服務事件已經發生 – Pointy

+0

事件調度系統?似乎與我想了解的有關 –

回答

2

第二個版本不是異步的......嵌套函數只是遞歸地調用自己(順便說一句,大數組是一個壞主意)。

爲了使其異步,您應該調度一個計時器(使用setTimeout),以便稍後繼續計算。

var index = 0; 
var total = 0; 
function step() { 
    if (index < array.length) { 
     total += array[index++]; 
     setTimeout(step, 0); 
    } else { 
     callback(total); 
    } 
} 
setTimeout(step, 0); 

在這種情況下,函數將立即返回給調用者,完成回調將在稍後(異步)在計算完成後調用。

內部實現的一種方法,例如setTimeout正在等待一堆計時器事件被觸發。當JS環境完成當前事件時,它將檢查下一步將要生成的內容,然後從調用處理程序的堆中移除該項。

還要注意,除了定時器事件之外,還有鼠標事件,網絡事件,消息事件等......通常,定時器事件被賦予最低優先級,所以只有在沒有其他事情可以做時纔會調用代碼(這是也是爲什麼計時不準確,並且延遲指定的延遲僅僅是最小延遲時間)。

即使沒有其他事件通常JS在例如瀏覽器會首先做一個DOM如果需要調用定時器處理程序之前重新粉刷(這就是爲什麼例如一個進度條會即使使用setTimeout(f, 0)進行處理更新。

+0

好的,我明白了。然而,這並沒有讓我更接近理解JS如何處理異步代碼的內部。我得到它*做的*,但是關於這些的細節是我無法找到的。我搜索的所有內容最終都會提供關於如何使用XHR,jQuery等的教程。 –

+0

我添加了有關計時器事件的可能實現策略(使用堆用於掛起的定時回調)的解釋。我不確定我的理解是什麼,你不明白的部分:-) – 6502

+1

@ Dropped.on.Caprica - 搜索網絡工作者,並試圖找出他們如何在內部工作,應該給你一個通用的線索,異步工作,並應該有更多的信息,因爲它是新技術。 – adeneo