在jQuery上发出ajax请求后,闭包在获取变量值方面似乎迟到了

Closure seem to be late on getting variable value after a ajax request on jQuery

本文关键字:变量值 获取 方面似 迟到 闭包 jQuery 请求 ajax      更新时间:2024-02-04

这似乎有点奇怪,但我的代码在进入循环时似乎检索变量值的时间较晚,只获取最后的值。好吧,我不知道该说什么,所以这里有一些代码。

$("#days").change( function () {
    var num_days  = $('#days').val();
    var URL       = BASE_URL + "/service/assemble_html";
    var languages = ['pt', 'en', 'fr', 'es'];
    var data;
    for (var i = 0; i <= 3; i++)
    {
        var lang = languages[i];
        data = {func: 'create_days', data: {days: num_days, lang: lang}};
        console.log(lang);
        // AJAX request, passing the LANG and NUMBER OF DAYS.
        $.post(URL, data, function(response) {
            $('#container_desc_' + lang).html(response);
            console.log("Make it for " + lang);
        });
    }
});

这是我的JS/jQuery代码。此请求返回(在浏览器响应上验证)4种给定语言中每种语言的HTML代码块。到目前为止,一切都比预期的要好。。。但是,在$('container_desc_' + lang)部分中,它应该包括为lang变量给定的不同容器生成的HTML代码。但是,不起作用!它正在为数组的最后一个元素工作,在本例中为"es"。

这里是我的控制台输出:

pt                     create.js:12
en                     create.js:12
fr                     create.js:12
es                     create.js:12
Make it for es         create.js:19
Make it for es         create.js:19 
Make it for es         create.js:19
Make it for es         create.js:19

有人知道我做错了什么吗?

闭包和作用域:

$("#days").change( function () {
    var num_days  = $('#days').val();
    var URL       = BASE_URL + "/service/assemble_html";
    var languages = ['pt', 'en', 'fr', 'es'];
    for (var i = 0; i <= 3; i++){
        var lang = languages[i],
            data = {func: 'create_days', data: {days: num_days, lang: lang}};
        (function(l,d) {
            $.post(URL, d, function(response) {
                $('#container_desc_' + l).html(response);
            });
        }(lang, data));
    }
});

for循环在回调函数执行时已经完成,因为它是异步的,所以您需要使用新的闭包来保持变量的值不变。