在彼此内部调用两个ajax函数

时间:2012-05-20 09:44:19

标签: php jquery ajax

我有一个ajax调用,它工作正常,当我在旧的调用新的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);
        }
    }

我尝试了它并且效果很好

2 个答案:

答案 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]); 圈内的所有地方forconcepts[i]将其更改为relations[i]currentConcept