2013-10-31 213 views
9

在運行下一個函數之前,有沒有辦法確保for循環已完成?等待循環完成

我有一個場景,其中用戶列表的用戶,他們可以選擇X號這些用戶,一旦他們爲每個已被選中的用戶按'完成'我調用一個REST API服務來獲得有關選定用戶添加到「用戶」陣列的更多信息。

但是,什麼是發生的事情是什麼,我把後for循環似乎已經完成之前運行,因此有網友失蹤它

下面

示例代碼:

function doCreateStory() { 
    var users = []; 

    // Add logged in user as creator 
    users.push({ 
     "id" : user_id, 
     "creator" : true 
    }); 

    // Add all checked users 
    for (var i = 0, len = items.length; i < len; i++) { 
     if (items[i].properties.accessoryType == Ti.UI.LIST_ACCESSORY_TYPE_CHECKMARK) { 
      api.UserSearch({ 
       "method" : "facebook", 
       "id" : items[i].properties.id 
      }, function(success, res, code) { 
       if (success == 1) { 
        users.push({ 
         "id" : res.message._id, 
         "creator" : false 
        }); 
       } else { 
        // Its broke.. 
       } 
      }); 
     } 
    } 

    // WANT TO DO SOMETHING HERE with 'users' array once loop has finished 

} 

回答

13

api.UserSearch是一個異步函數。您應該跟蹤回覆以及何時全部進入,然後處理返回的數據。

var requests = 0; 
for (var i = 0, len = items.length; i < len; i++) { 
    if (items[i].properties.accessoryType == Ti.UI.LIST_ACCESSORY_TYPE_CHECKMARK) { 
     requests++; 
     api.UserSearch({ 
      "method" : "facebook", 
      "id" : items[i].properties.id 
     }, function(success, res, code) { 
      requests--; 
      if (success == 1) { 
       users.push({ 
        "id" : res.message._id, 
        "creator" : false 
       }); 
      } else { 
       // Its broke.. 
      } 
      if (requests == 0) done(); 
     }); 
    } 
} 
function done() { 
    // WANT TO DO SOMETHING HERE with 'users' array once loop has finished 
} 

這將增加一個計數器requests,當他們都來了,就應該調用該函數done()

+1

這似乎是工作,我想ID必須做'請求++'或類似'請求= '這是全部破產'來解釋是否有任何失敗的請求? – Tam2

+0

實際上,我可以將'requests - '移入成功聲明 – Tam2

+0

是的,您需要確保每個分支遞減請求(我的示例具有請求 - if/else之上,因此它應該計算請求。 – jeremy

2

的問題在於事實上,asyncrounus AJAX請求需要時間才能完成。處理這種情況的一個方法是使用一個條件是你成功的處理程序:

var completedRequests = 0; 

// Add all checked users 
for (var i = 0, len = items.length; i < len; i++) { 
    if (items[i].properties.accessoryType == Ti.UI.LIST_ACCESSORY_TYPE_CHECKMARK) { 
     api.UserSearch({ 
      "method" : "facebook", 
      "id" : items[i].properties.id 
     }, function(success, res, code) { 
      if (success == 1) { 
       completedRequests++; 
       users.push({ 
        "id" : res.message._id, 
        "creator" : false 
       }); 
       if (completedRequests === len){ 
        //all ajax requests are finished 
       } 
      } else { 
       // Its broke.. 
      } 
     }); 
    } 
}