首页 > 解决方案 > 如何从带有回调参数的循环发送多个 GET 请求?

问题描述

我需要在一个循环中发送多个 get 请求,处理响应的回调需要循环的索引,以便将响应数据与我已经拥有的关于每个对象的数据结合起来。

由此,知道如何创建单个请求并使用回调传递额外的参数。我还能够发送多个请求并使用 XMLHttpRequest.onreadystatechange 为结果设置函数。

我尝试将这两种解决方案结合起来,但是因为它是一个循环,所以每次迭代后变量都会发生变化,并且所有响应最终都会被循环最后一次迭代的参数调用。我认为var indexOfProject = i;在循环内使用可以解决问题,但事实并非如此。这是我的代码:

var count = 0;
var queryProjects = 2;
var totalNeeded = queryProjects;

var apicallback = function(project, index) {
    if (xmlHttp.readyState == 4 && xmlHttp.status == 200) {  
        console.log("processing response, index, project : " + index);
        console.log(project);
        var objResponse = JSON.parse(xmlHttp.responseText);
        _projectsData.projects[index]['lastUpdateTime'] = objResponse['updated_at'];
        count++;
        if (count==totalNeeded){
            console.log("got all responses!");
            //TODO: 
        }
    }
};

for (var i = 0; i < queryProjects; i++) {
    var indexOfProject = i;
    if (repos[i] != null) {
        var theUrl = "https://api.github.com/repos/" + repos[i][0];
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.onreadystatechange = function() { 
            apicallback(_projectsData.projects[indexOfProject], indexOfProject); 
        }
        console.log("sent request!");
        xmlHttp.open("GET", theUrl, true); // true for asynchronous 
        xmlHttp.send(null);
    }
    else {
        totalNeeded--;
    }
}

这个我也试过

xmlHttp.onreadystatechange = apicallback(_projectsData.projects[indexOfProject], indexOfProject); 

但更糟糕的是,回调只被调用一次,when readystate==1

标签: javascriptajaxget

解决方案


推荐阅读