2014-07-18 20 views
0

我試圖確定在以下循環中的最後一個回調函數調用。目前,循環執行速度比內部函數快,並且在最後一次回調之前標誌被設置爲真。我需要的是僅在最後一次回調期間將標誌設置爲真。我如何修改下面的代碼:在for循環中設置一個標誌,用於在同一個循環中調用的函數的回調函數中

// global variable flag 
var flag = false; 
var files = [..]; // some array of files 
var count = files.length; 

for (i = 0; i < count; i++) { 
    var file = files[i]; 
    flag = count - i == 1; // Sets true when last item is processed in the files array 
    request = some-api.get(file.id); 
    request.execute(callback.bind(this)); 
} 

function callback(data){ 
    if(flag){ 
    // Do something with data 
    data.use(); 
    } 
} 
+0

'.execute()'異步嗎?如果是這樣,你應該將標誌傳遞給回調函數,而不是嘗試在全局變量中使用它。 '.bind()'將允許你傳遞'.execute()'通常發送給它的額外參數。 – jfriend00

+0

'.execute()'是異步的。這是造成這個問題的原因。這不是我的代碼,而是我使用的API。因此,我認爲我不能將標誌傳遞給回調方法。任何其他想法? – Tom

+0

'.bind()'可以爲你解決這個問題。我已經說明了如何在下面的答案。 – jfriend00

回答

1

因爲.execute()是異步的,你不能使用一個全球性的標誌,因爲你不知道有回調通信時的回調將被調用,有沒有辦法給一個全局標誌值爲一次調用回調,另一次調用回調的另一次調用。

取而代之,您可以使用.bind()的功能將標誌傳遞給回調函數以將參數添加到該函數。它可以做這樣的:

// global variable flag 
var files = [..]; // some array of files 

for (i = 0; i < files.length; i++) { 
    var flag = (i >= files.length - 1); // true when we are on last item 
    some-api.get(files[i].id).execute(callback.bind(this, flag)); 
} 

function callback(flag, data){ 
    if(flag){ 
    // Do something with data 
    data.use(); 
    } 
} 

參數傳遞給.bind()this指針將被預置到,否則將被髮送到回調的參數。因此,基本上.execute()將使用一個參數調用您的.bind()包裝,然後在調用實際回調之前,包裝器將插入您的參數。只要你知道你的回調參數是如何工作的,你就會得到你想要的。