对于循环,XHR,范围

时间:2016-05-27 18:47:27

标签: jquery ajax xmlhttprequest

我真的陷入了一个范围问题。这里的任何人都可以帮我找一下这个片段的错误吗?

所以我有一些与问题组相关的调查。而且我试图通过调查来获取有关相关问题组的数据,除非我真的丢失了我应该在哪个范围内设置问题组。

下面的代码段中的第一个功能将qg记录为' undefined'从第二个函数返回。

function loadData() {
  var params = {};
  var surveyURL = "surveys/";
  var surveys, qg;
  var survey_ids = [];
  // this below calls the URL 
  var $surveyXHR = klp.api.do(surveyURL, params);
  // this below is essentially $.ajax.done()
  $surveyXHR.done(function(data) {
    surveys = data["features"];
    for(var each in surveys) {
      qg = getSurveysQuestionGroup(surveys[each]["id"]);
      console.log(qg);
      // surveys[each]["created_by"] = qg["created_by"]["first_name"]
    }
    console.log(surveys);
  });

}

function getSurveysQuestionGroup (surveyId) {
  var params = {};
  var qg;
  var qgURL = "surveys/"+ surveyId + "/questiongroups/";
  var $qgXHR = klp.api.do(qgURL, params); 
  $qgXHR.done(function(data) {
        qg= data["features"];
        //console.log(qg);
        return(qg);
  });
}

2 个答案:

答案 0 :(得分:0)

你误解了ajax是如何工作的。您的函数getSurveysQuestionGroup可以像这样重写:

function getSurveysQuestionGroup (surveyId) {
  var params = {};
  var qg;
  var qgURL = "surveys/"+ surveyId + "/questiongroups/";
  var $qgXHR = klp.api.do(qgURL, params); 
  $qgXHR.done(processQgXHR);
  return; // THIS is what you are getting back in loadData!
}

function processQgXHR(data) {
  var qg = data["features"];
  return(qg); // not being used!
}

您需要重构代码。理想情况下,您希望使用返回值从内部 ajax回调函数本身采取行动,。 Ajax和返回值通常不能很好地混合。

如果您熟悉多线程编程,请将ajax请求视为创建新线程,而不是函数调用。

答案 1 :(得分:0)

感谢。最初我有这个,但调查似乎超出了ajax.done函数的范围。所以我理解ajax调用是异步的并且自己旋转。但我想构建依赖关系,对于每次调查,我都会得到问题组,在调用完成后,我会在调查中添加一些数据。然后转到下一个。但是使用下面的代码:a)调用随机完成,我也尝试使用$ .ajax.always()b)Survey对象超出了问题组ajax.done()调用范围。我只是不理解这个问题。如果有人可以建议这些嵌套电话的结构,我很乐意跟进。

function loadData() {
  var params = {};
  var surveyURL = "surveys/";
  var $surveyXHR = klp.api.do(surveyURL, params);
  $surveyXHR.done(function(data) {
    var surveys = data["features"];
    for(var each in surveys) {
      var qgURL = "surveys/"+ surveys[each]['id'] + "/questiongroups/";
      params = {}
      var $qgXHR = klp.api.do(qgURL, params); 
      $qgXHR.done(function(data) {
        var qg = data["features"][0]; //Change this later when we have active filter
        surveys[each]["created_by"] = qg["created_by"]["first_name"] + ' ' + qg["created_by"]["last_name"],
        var qURL = qgURL + qg["id"] + "/questions";
        var $qXHR = klp.api.do(qURL, params);
        $qXHR.done(function(data) {
          var questions = data["features"];
          surveys[each]['questions'] = questions;
        });
      });
      console.log(surveys[each]);
    }
  });
}