Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在循环中附加胡须模板_Javascript_Jquery_Ajax_Mustache - Fatal编程技术网

Javascript 在循环中附加胡须模板

Javascript 在循环中附加胡须模板,javascript,jquery,ajax,mustache,Javascript,Jquery,Ajax,Mustache,我试图多次附加相同的mustache模板,但每次都使用不同的值,这些值是通过ajax从php获得的。这些值存储在一个数组中 不幸的是,每个附加的模板都包含数组中最后一个条目的值 如果我添加了警报测试;在循环结束时,它正在工作。我必须等到append函数完成吗?如果是,我该怎么做 谢谢 $(document).ready(function postData() { var id = localStorage.getItem('user-id'); var token

我试图多次附加相同的mustache模板,但每次都使用不同的值,这些值是通过ajax从php获得的。这些值存储在一个数组中

不幸的是,每个附加的模板都包含数组中最后一个条目的值

如果我添加了警报测试;在循环结束时,它正在工作。我必须等到append函数完成吗?如果是,我该怎么做

谢谢

$(document).ready(function postData() {
        var id = localStorage.getItem('user-id');
        var token = localStorage.getItem('user-token');
        var vars = "id=" + id + "&token=" + token;
        var hr = new XMLHttpRequest();
        var url = "../php/getUsers.php";

          hr.onreadystatechange = function () {
            if (this.readyState == 4 && this.status == 200) {
                var data = JSON.parse(hr.responseText);

                for(var i=0;i<data.length;i++){

                        var templateData = {
                            name: data[i].name,
                            id: data[i].id

                        };
                      var id=templateData['id'];

                      $.get('templates/user.htm', function(templates) {

                            var template = $(templates).filter('#user-template').html();
                            $('#user-container').append(Mustache.render(template, templateData));
                        });
                 //alert("Test"); 
                 }
            }
        }
        hr.open("POST", url, true);
        hr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

        hr.send(vars);
    });

问题是,当调用$.get调用的回调函数时,templateData在for循环的下一次迭代中已经发生了更改

要避免此常见的关闭问题,可以执行以下操作:

$.get('templates/user.htm', (function (templateData) {
    return function(templates) {
        var template = $(templates).filter('#user-template').html();
        $('#user-container').append(Mustache.render(template, templateData));
    }
})(templateData));
如果使用ES2015,则无需更改回调函数,因为可以使用let而不是var来定义templateData变量:

let templateData = {
    name: data[i].name,
    id: data[i].id

};

...

$.get('templates/user.htm', function(templates) {
    var template = $(templates).filter('#user-template').html();
    $('#user-container').append(Mustache.render(template, templateData));
});

查找setTimeout in loops的修复程序,相同的关闭问题…如果没有ES2015,在Arduino-Samsung Internet、Microsoft-Microsoft Edge上测试的移动设备上似乎不起作用。你知道我为什么以及如何修复它吗?你有错误吗?有没有一个控制台可以检查错误?我意识到这与我最初的问题无关。控制台显示:SyntaxError:JSON解析错误:如果this.readyState==4&&this.status==200,则意外的EOF和高亮显示行{我想我应该在单独的问题中询问此问题尝试记录hr.responseText:Console.loghr.responseText的值。有关此问题的新问题: