2017-01-15 9 views
1

ちょっと、jsonpと同じコールバック関数を使って複数のリクエストを呼び出せるようにしたいと思います。私が現在やっているやり方は、各呼び出しの間隔を設定することです。これは、10回の要求呼び出しを行いたい場合、すべてのデータを取得するのに10秒かかります。私は時間を短縮すると、それはparseerrorを返します。jsonpと同じコールバック関数を使用して複数のリクエストを行う

これらの要求をほぼ同時に行うことができる方法があるかどうかは疑問でした。ここで

は、Ajaxリクエストのコールのために私のコードです:(関連するコード)

var parameterMap = OAuth.getParameterMap(message.parameters); 
    console.log("3"); 
    $.ajax({ 
    'url' : message.action, 
    'data' : parameterMap, 
    'dataType' : 'jsonp', 
    'async' : 'true', 
    'jsonpCallback' : 'cb', 
    'cache': true 
    }) 
    .done(function(data, textStatus) { 
    console.log("Coming in"); 
    var mapIndex = yelpRequestCounter.toString(); 
    console.log("Map Index being set is: " + mapIndex); 
    yelpResults = yelpResults.set(mapIndex, data.businesses); 
     console.log("4"); 
     console.log("Success promise: " + yelpRequestCounter); 
     console.log("Ending"); 
     if(yelpRequestCounter == 9){ 
      findPriorityResuts(subPoints); 
      yelpRequestCounter = 0; 
     } 
     // console.log('success[' + JSON.stringify(data) + '], status[' + textStatus + ']'); //', jqXHR[' + JSON.stringify(jqXHR) + ']\n'); 
    } 
) 
    .fail(function(data) { 
    console.log("Failed") 
     // console.log('error[' + errorThrown + '], status[' + textStatus + '], jqXHR[' + JSON.stringify(jqXHR) + ']'); 
    } 
); 

}

私はすべての私のデータを取得していた場合、私は思ったので、私のコールバック関数は、単に空のメソッドであります約束では、私は間違いがないでしょう(私は間違っていました)。私は、時間を短縮したり、悪い接続のある場所にあった場合、これはほとんど機能しません

var generateBusiness = function(term, subPointResults){ 
    console.log("generateBusiness is being called"); 

    var waitForCB = setInterval(function(){ 
    console.log("CB Counter = " + yelpRequestCounter); 
    latlngString = subPointResults[yelpRequestCounter].lat().toString() + "," + subPointResults[yelpRequestCounter].lng().toString(); 
    yelpSearch(term, latlngString,subPointResults); 
    yelpRequestCounter++; 
    console.log(yelpRequestCounter + "---------------------"); 

    if(yelpRequestCounter === subPointResults.length){ 
     console.log("It stops!"); 
     clearInterval(waitForCB); 
    } 

    },1000); 
} 

:ここ

は、要求を行う機能です。

あなたの時間と助けてくれてありがとう! :)

答えて

2

あなたの問題はJqueryの$ when()。then()関数を使って解決できると思います。

ここでは、それができる方法のサンプルテンプレートを示します。

$.when(ajax1(), ajax2().., ajaxN()).then(function(response1, response2,.., responseN){ 

}); 

function ajax1() { 
    return $.ajax({ 
    url: "url", 
    dataType: "jsonp", 
    ... 
}); 
} 

function ajax2() { 
    return $.ajax({ 
    url: "url", 
    dataType: "jsonp", 
    ... 
}); 
} 
... 

編集:あなたは、複数の関数を書くの代わりに、すべてのAJAX要求を行うためにループを使用したい場合はまた、あなたがFunction.prototype.applyのプロパティを使用することができます。例えば$.when.apply($, my_array);

ここにサンプルテンプレートがあります。

var results = []; // results of all the ajax calls 

function getPromises() { 
    var promises = []; 

    var i = 1; 
    for (i = 1; i <= 2; i++) { 
     var count = i; 

     promises.push(
      $.post('/echo/html/', { 
       html: "<p>Task #" + count + " complete.", 
       delay: count 
      }).success(function(data) { 

       results.push(data) 
      })); 
    } 

    return promises; 
} 

$(function() { 
    $("a").click(function() { 


     var promises = getPromises(); 

     $.when.apply(null, promises).done(function() { 

      $("div").append("<p>All done!</p>" + results[0] + " | " + results[1]); 
     }); 

    }) 
}) 

HTML:

<a href="#">Make Ajax Requests!</a> 
<div></div> 
+0

はあなたが起草気でしょうか?私の理解のために、私は大量のAjaxリクエストをたくさん作る必要がありますか? requestNから取得するデータの応答ですか? – lobcity42

+0

こんにちは@ lobcity42、 'then()'の中のコールバックは、when()で行われたすべてのajax呼び出しが完了(完了)した後にのみ実行されます。したがって、各Ajaxレスポンスを別々に待つ必要はありません。 response1、response2..etcは、Ajax呼び出しから返されるresponseDataです。 – Piyush

+0

また、$ .when()関数内で必要なだけ多くのajax呼び出しを行うことができます。 – Piyush

関連する問題