2

特定の配列に対して ajax リクエストを実行し、サーバーの応答を待ってから、ループの次の反復に進む必要があります。

現在、反復を同時に実行しています。確実に成功してから、どのように進めればよいですか?

アドバイスをありがとう。

myArray.each(function(val, index) {
    new Ajax.Request(myUrl + val, {
        onSuccess: function() {
               responseFromServer();
        }
    });
    void(0);
});
4

4 に答える 4

3

AJAX 要求が終了した後にのみ、次の反復に進む必要があります。jQuery を使用して例を示します。

function sendRequests(requests) {
    var value = requests.shift();
    $.ajax(myUrl + value).done(function(data){
        if (requests.length > 0) {
            sendRequests(requests);
        }
    });    
}

sendRequests( [1,2,3,4] );
于 2012-10-23T18:13:30.167 に答える
2

このようにしてみるかもしれません

function getItem(url, array, index)
{
   new Ajax.Request(url + array[index])
   {
      onSuccess : function()
      {
        responseFromServer(); //assuming this handles the server response
        if (index < array.length)
           getItem(url, array, ++index);
      }
   }
}

それからそれを呼び出すだけです

getItem(myUrl, myrray, 0);

基本的に、配列内の次の項目で、コールバックが次の ajaxrequest を開始するようにします。

于 2012-10-23T18:12:03.070 に答える
0

このジョブのクラスを作成できます。そのprocessNext()関数は、配列内のすべてのアイテムを処理します。

var arrayProcessor = {
        values: [],
        process: function(arr) {
           arrayProcessor.values = arr;
           arrayProcessor.processNext();  
        },
        processNext: function(){
            if (arrayProcessor.values.length > 0) {
              new Ajax.Request(myUrl + arrayProcessor.values.shift(), {
                  onSuccess: function() {
                       responseFromServer();
                       arrayProcessor.processNext();  
                  }
              });
           }
        },

    }
于 2012-10-23T18:17:47.540 に答える
0

このようなことを試してください。基本的に、すべての要素を反復処理する代わりに、配列から最初のアイテムをデキューし、AJAX リクエストを行います。次に、リクエストが正常に完了したら、次のアイテムを呼び出します。

この例では、元の配列が変更されていることに注意してください。

function invokeAll(myArray)
{
    var val = myArray.shift(); //get the next item to be processed
    if (!val)
        return;
    new Ajax.Request(myUrl + val, {
        onSuccess: function() {
               responseFromServer();
               invokeAll(myArray); //got a successful response, start the next one
        }
    });
}
于 2012-10-23T18:12:20.993 に答える