我真的陷入了一个范围问题。这里的任何人都可以帮我找一下这个片段的错误吗?
所以我有一些与问题组相关的调查。而且我试图通过调查来获取有关相关问题组的数据,除非我真的丢失了我应该在哪个范围内设置问题组。
下面的代码段中的第一个功能将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);
});
}
答案 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]);
}
});
}