2013-10-31 19 views
9

forループが次の関数を実行する前に終了したことを確認する方法はありますか?待ちループが終了する

ユーザーのリストが表示され、これらのユーザーのX番号を選択できます。選択したユーザーごとに「完了」を押すと、取得するREST APIサービスが呼び出されます。選択されたユーザーが 'users'配列に追加する情報

しかし、何が起こっている私は、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は 'リクエストを行う必要があると思い++や' 'リクエストのようなもの=失敗したリクエストがあればそれを説明するために「それはすべて壊れました」の中に「100」と表示されますか? – Tam2

+0

実際には私は 'requests - 'を成功宣言文に移すことができます – Tam2

+0

はい、各ブランチがリクエストを減らすようにしたいと思うでしょう(私の例はリクエストを持っています。 – jeremy

2

問題がにありますasyncrounus AJAXリクエストが完了するまでに時間がかかるという事実。これを処理する1つの方法は、成功ハンドラである条件を使用することです。

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.. 
      } 
     }); 
    } 
} 
関連する問題