2013-10-31 24 views
9

Có cách nào để đảm bảo vòng lặp for đã kết thúc trước khi chạy hàm tiếp theo?Đợi vòng lặp kết thúc

Tôi có trường hợp người dùng được hiển thị danh sách người dùng, họ có thể chọn số X của những người dùng này và khi họ nhấn 'Xong' cho mỗi người dùng đã được chọn Tôi gọi dịch vụ API REST để nhận một số thông tin khác về người dùng được chọn để thêm vào mảng 'người dùng'.

Nhưng những gì xảy ra là bất cứ điều gì tôi đặt sau khi vòng lặp for có vẻ chạy trước khi nó đã kết thúc và do đó có những người mất tích từ nó

Mẫu mã bên dưới:

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 

} 

Trả lời

13

api.UserSearch là một chức năng không đồng bộ. Bạn nên theo dõi các câu trả lời và khi nào họ có tất cả, hãy xử lý dữ liệu được trả về.

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 
} 

này sẽ tăng số đếm requests và khi họ có tất cả đi vào, nó sẽ gọi hàm done()

+1

Điều này dường như làm việc, tôi đoán id phải làm 'yêu cầu ++' hoặc một cái gì đó như 'yêu cầu = 100' trong 'Đó là tất cả đã phá vỡ' để giải thích nếu có bất kỳ yêu cầu nào không thành công? – Tam2

+0

Thực ra tôi chỉ có thể di chuyển 'yêu cầu -' vào câu lệnh thành công – Tam2

+0

Có, bạn sẽ muốn đảm bảo rằng mỗi nhánh giảm yêu cầu (ví dụ của tôi có yêu cầu-- phía trên if/else để nó đếm yêu cầu. – jeremy

2

Vấn đề nằm ở chỗ thực tế là các yêu cầu asyncrounus AJAX mất thời gian để hoàn thành. Một cách để xử lý điều này là sử dụng điều kiện là trình xử lý thành công của bạn:

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.. 
      } 
     }); 
    } 
} 
Các vấn đề liên quan