我有一个ajax调用,它工作正常,当我在旧的调用新的ajax调用时,我在第一次调用时遇到错误
$.getJSON("http://localhost/Mar7ba/Ontology/getRelatedConceptsAndRelations/"+conceptName+"/TRUE",function(data){
var concepts = data[0];
var relations = data[1];
for(var i = 0 ; i < concepts.length ; i++){
var IOS = '';
$("#ioAddRelatedConcepts").append('<p>\n\
connect to\n\
<span class="ioAddConcept">'+concepts[i]+'</span>\n\
with\n\
<span class="ioAddRelation">'+relations[i]+'</span>\n\
<select name ="concetedIOs[]" class="TypeSelector">\n\
'+IOS+'</select>\n\
<span class="errorMessage"></span>\n\
<a href="#" class="removeA" id="aioRemoveIO">remove</a>\n\
</p>\n\
<p>');
}
});
添加此ajax调用后$.getJSON("http://localhost/Mar7ba/Ontology/getRelatedConceptsAndRelations/"+conceptName+"/TRUE",function(data){
var concepts = data[0];
var relations = data[1];
for(var i = 0 ; i < concepts.length ; i++){
$.getJSON("http://localhost/Mar7ba/InformationObject/getIOsForConcept/"+concepts[i]+"/TRUE",function(data1){
var IOS = '';
$("#ioAddRelatedConcepts").append('<p>\n\
connect to\n\
<span class="ioAddConcept">'+concepts[i]+'</span>\n\
with\n\
<span class="ioAddRelation">'+relations[i]+'</span>\n\
<select name ="concetedIOs[]" class="TypeSelector">\n\
'+IOS+'</select>\n\
<span class="errorMessage"></span>\n\
<a href="#" class="removeA" id="aioRemoveIO">remove</a>\n\
</p>\n\
<p>');
});
}
});
之后,概念[i]和关系[i]将是一样的
,data1.length始终为null
这是ajax的第二个PHP代码
public function getIOsForConcept($conceptName, $AJAX) {
if ($AJAX) {
$results = $this->model->getIOsForConcept($conceptName);
$IOs = array();
$i = 0;
while ($row = $results->fetch()) {
$IOs[$i] = $row['name'];
$i++;
}
return json_encode($IOs);
}
}
我尝试了它并且效果很好
答案 0 :(得分:4)
你不能在回调函数中使用循环变量(i
) - 它将具有在调用异步回调函数时循环终止时的任何值。
由于您已经在使用jQuery,因此您也可以使用$.each()
:
$.getJSON(..., function(data) {
var concepts = data[0];
var relations = data[1];
$.each(concepts, function(i, value) {
// concepts[i] is OK to use now, and is also in "value"
// relations[i] is OK to use too
$.getJSON(..., function() {
// you can still use them here, too!
});
});
});
将确保i
每次都正确绑定到当前迭代次数。
答案 1 :(得分:3)
内部concepts[i]
函数的回调函数中relations[i]
和$.getJSON()
未定义的原因是$.getJSON()
aysnchronous 意味着在内部$.getJSON()
调用发生任何回调之前,整个for循环将完成运行 - 所以当这些内部回调发生时i
比{{1}的最大索引高一个1}}和concepts
数组。
为了解决这个问题,你可以引入一个额外的闭包来保持每次迭代的值:
relations
我在for循环中添加的匿名函数将在每次迭代中运行一次,创建单独的闭包,每个闭包都有自己的$.getJSON("http://localhost/Mar7ba/Ontology/getRelatedConceptsAndRelations/"+conceptName+"/TRUE", function(data){
var concepts = data[0];
var relations = data[1];
for(var i = 0 ; i < concepts.length ; i++){
(function(currentConcept, currentRelation) {
$.getJSON("http://localhost/Mar7ba/InformationObject/getIOsForConcept/"+currentConcept+"/TRUE" , function(data1){
var IOS = '';
$("#ioAddRelatedConcepts").append('<p>\n\
connect to\n\
<span class="ioAddConcept">'+ currentConcept +'</span>\n\
with\n\
<span class="ioAddRelation">'+ currentRelation +'</span>\n\
<select name ="concetedIOs[]" class="TypeSelector">\n\
'+IOS+'</select>\n\
<span class="errorMessage"></span>\n\
<a href="#" class="removeA" id="aioRemoveIO">remove</a>\n\
</p>\n\
<p>');
});
})(concepts[i], relations[i]);
}
});
和currentConcept
。
编辑:与原始代码相比,我的变化非常明显 -
将以下行添加为现有currentRelation
循环中的第一行:
for
然后将以下行作为现有 (function(currentConcept, currentRelation) {
循环关闭for
之前的最后一行:
}
然后, })(concepts[i], relations[i]);
圈内的所有地方for
和concepts[i]
将其更改为relations[i]
和currentConcept
。