2017-05-31 65 views
0

次は、jQueryを順に使用して各ajax呼び出しを実行します。呼び出しは順番に行う必要があります。私がこの作品を見つけた唯一の方法は、async:falseを使用することです。これは非推奨であり、使用すべきではありません。以下のコードは、[name]配列の各要素をループし、各Ajaxリクエストを順番に起動します。 async:falseを削除すると、ajax呼び出しは順不同で行われ、時にはそれらのうちの1つが起動しないように見えることがあります。私はajaxCompleteがここで私を助けるかもしれないと思ったが、私は運がなかった。これらのajax呼び出しを順番に実行させる方法はありますか?JQuery - 複数のajaxリクエストを順番に実行するようにします。

function doGetJson(name1) { 
    var URL = 'http://some url/?name=' + name1; 
    $.ajax({ 
     url : URL, 
     dataType : 'jsonp', 
     async: false, 
     jsonpCallback : 'getJson', 
     name: name1, 
     index: i, 
     success : handleJson 
    }); 
}; 

function handleJson(data) { 
    <...some other operations...> 

}; 

var name = "test1,test2,test3".split(","); 

for (var i = 0; i < name.length ; i++) 
{ 
    doGetJson(name[i]); 
} 
+0

は、あなたが次のAJAX呼び出しを行う必要がある理由はありますか? – ErikusMaximus

+0

各ajax呼び出しの結果はマップ・レイヤーです。マップ・レイヤーはマップに特定の順序で追加する必要があります。 – firsttube

答えて

0

約束を守ってください。まず、あなたの関数はそうのような$.ajaxを返してみましょう:

function doGetJson(name1) { 
    var URL = 'http://some url/?name=' + name1; 

    // notice the return !!! 
    return $.ajax({ 
     url : URL, 
     dataType : 'jsonp', 
     async: false, 
     jsonpCallback : 'getJson', 
     name: name1, 
     index: i, 
     success : handleJson 
    }); 
}; 

次に、あなたがそのようにそれらをチェーン:

var name = "test1,test2,test3".split(","); 

var promise = name.slice(1) 
    .reduce((a,b) => a.then(doGetJson.bind(null, b)) 
     , doGetJson(name[0])) 

promise.then(function(){ 
    // do something when all requests are ready 
}) 
+0

お返事ありがとうございます。私はコールバックの参照を一意のコールバック名で置き換えることでこれを解決したようです。 getJsonの代わりに私は "名前1"を使用しました。私は、jQueryは、順次非同期呼び出しで問題を引き起こす可能性のあるコールバック関数を再利用すると考えています。 – firsttube

関連する問題