【问题标题】:Making multiple request using jsonp and same callback function使用 jsonp 和相同的回调函数发出多个请求
【发布时间】:2017-01-16 05:49:50
【问题描述】:

嘿,我想实现能够使用 jsonp 和相同的回调函数调用多个请求。我目前这样做的方式是设置每次调用之间的间隔,这很可怕,因为如果我想进行 10 次请求调用,则需要 10 秒才能检索所有数据。如果我缩短时间,那么它会返回一个解析错误。

我想知道是否有任何方法可以几乎同时提出这些请求。

这是我的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) + ']');
    }
  );

}

我的回调函数只是一个空方法,因为我认为如果我在 promise 中检索了所有数据,那么我就不会出错。(我错了)。

这是发出请求的函数:

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);
}

如果我缩短了时间或在连接不良的地方,那么这几乎不起作用。

感谢您的时间和帮助! :)

【问题讨论】:

    标签: javascript jquery ajax jsonp


    【解决方案1】:

    我相信您的问题可以通过使用 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>
    

    【讨论】:

    • 您介意详细说明一下吗?据我了解,无论我想要多少,我都需要发出 X 数量的 ajax 请求吗?响应是我将从 requestN 检索到的数据吗?
    • 嗨@lobcity42,'then()' 内部的回调只有在 when() 中进行的所有 ajax 调用都完成(完成)后才会执行。因此,您不必单独等待每个 ajax 响应。 response1 , response2 ..etc 是您从 Ajax 调用中返回的 responseData。
    • 此外,您可以在 $.when() 函数中进行任意数量的 ajax 调用。
    • 嘿@piyush,那么这是否意味着我需要创建多个ajax 请求函数?如果我想在单个 ajax 请求函数上发出多个请求,它会起作用吗?
    • 详细说明。如果我将 when,then 函数封装在一个 for 循环中并重复调用我的 ajax 请求,那么每个 ajax 请求是否会成功链接到正确的请求?
    猜你喜欢
    • 2011-12-15
    • 2013-10-17
    • 2015-03-11
    • 2013-12-07
    • 1970-01-01
    • 2016-06-10
    • 2017-12-30
    • 2015-06-23
    • 2011-09-27
    相关资源
    最近更新 更多