2016-08-16 5 views
0

$.when()メソッドにフィードされるAjaxリクエストのリストを作成しようとしているので、すべてのリクエストが完了したら何かできます答えは、例:https://stackoverflow.com/a/24050887/1952996)。

私は、このコード(jsfiddle)を思い付いた:

function getUserData(username){ 
    return $.ajax({ 
    url:"/echo/json/", 
     data:{json: $.toJSON({"username": username}), 
       delay: 3}, 
     type:"POST", 
     success:function(response) 
     { 
     console.log(response); 
     } 
    });} 

    var userList = ["userA", "userB"]; 

    var userRequests = []; 

    userList.forEach(function(u){ 
    userRequests.push(getUserData(u)); 
    }) 

私はこれを実行すると、私はデータをコンソールに記録されますことがわかります。何故ですか?私は、私がAjax要求を構築していると思っていました。私はAjaxオブジェクトを返すようになっています。そして、私はこのオブジェクトをuserRequestsに格納しようとします。しかし、これらはすでに呼び出されているべきではありません。私は何が欠けていますか?

+1

'getUserData(U)' 'AJAX-call'を起動すると、'繰延オブジェクトを返しますが'データは' then/done'ハンドラを使ってアクセスすることができました... – Rayon

+0

どうしたのか分かりませんでした。しかし、あなたのコメントは、私に重要な情報を提供します。 ajax呼び出しは 'getUserData(u)'で直ちに行われ、その要求が完了した後にsuccess関数の副作用が発生します。 – zelite

答えて

1

jQuery.ajaxは、呼び出されたときにAJAX呼び出しを行い、AJAX遅延オブジェクトを返すように設計されています。

あなたのコードは次のように全く似ています。

function getUserData(username){ 
    var result = $.ajax({ 
    url: "/echo/json/", 
    data: { json: $.toJSON({"username": username}), delay: 3 }, 
    type: "POST", 
    success: function(response) 
    { 
     console.log(response); 
    } 
    }); 

    return result; 
} 

それは明確に要求が関数呼び出しの瞬間に作られていることを示しています。
$.whenを使用すると、すべてのリクエストが完了するまで待つことができます。

P.S.ところで、あなたはあなたのforEachを置き換えることができます。

var userList = ["userA", "userB"]; 

var userRequests = []; 

userList.forEach(function(u){ 
    userRequests.push(getUserData(u)); 
}); 

mapを使用して短いバージョンで:

var userList = ["userA", "userB"];  
var userRequests = userList.map(getUserData); 
関連する問題