【问题标题】:Javascript variable doesn't update outside of loop, inside OKJavascript变量不会在循环外更新,在OK内
【发布时间】:2013-02-26 08:36:21
【问题描述】:

我希望我不会在这里遗漏一些明显的东西。

function renderViews(containerId) {

    var root = '../Views/';
    var viewsDomStr = '';

    for (var i = 0; i < bundles.views.length; i++) {
            $.get(root + bundles.views[i], function (data) {
            viewsDomStr = viewsDomStr.concat(data);
        });
    }

    console.log(viewsDomStr);
    $('#' + containerId).append(viewsDomStr);

}

问题是viewsDomStr 仅在for 循环内根据来自服务器的data 更新。对于console.log(viewsDomStr);,我得到的只是重置为''

【问题讨论】:

  • 你的 get 是一个 ajax 请求。当您到达 console.log 时,回调不会执行

标签: javascript jquery string variables for-loop


【解决方案1】:

你调用的函数是异步的。

试试

function renderViews(containerId) {

    var root = '../Views/';
    var viewsDomStr = '';

    function cb(){
        console.log(viewsDomStr);
        $('#' + containerId).append(viewsDomStr);
    }

    for (var i = 0; i < bundles.views.length; i++) {
            $.get(root + bundles.views[i], function (data) {
            viewsDomStr = viewsDomStr.concat(data);
            cb();
        });
    }
}

【讨论】:

    【解决方案2】:

    问题是$.get 请求是异步的,所以程序会继续运行并且不会等待它。您想在$.get 函数中使用viewsDomStr

    function renderViews(containerId) {
    
        var root = '../Views/';
    
        for (var i = 0; i < bundles.views.length; i++) {
            $.get(root + bundles.views[i], function (data) {
                console.log(data);
                $('#' + containerId).append(data);
            });
        }
    
        // This section runs before $.get is finished
    }
    

    编辑:我发现viewsDomStr 实际上是多余的。您只是向元素添加文本,因此您可以将其添加到 $.get

    【讨论】:

    • 我不想在循环的每一轮都使用 jQuery 的 append 方法。这就是为什么我实际上使用的是连接字符串。
    • 怎么样?您可以只使用从请求中返回的数据对象,不需要 viewsDomStr。
    • 是的,我想添加一次,但似乎一个一个添加它是最优化的解决方案。
    【解决方案3】:

    由于 get 方法发送异步请求,您可以使用 setInterval 每 1 秒检查一次响应:

    function renderViews(containerId) {
    
        var root = '../Views/';
        var viewsDomStr = '';
    
        var success = false;
    
        for (var i = 0; i < bundles.views.length; i++) {
                $.get(root + bundles.views[i], function (data) {
                viewsDomStr = viewsDomStr.concat(data);
                success = true;
            });
        }
    
        var t = setInterval(function(){
            if(success) {
                console.log(viewsDomStr);
                $('#' + containerId).append(viewsDomStr);
                clearInterval(t);
            }
        },1000);
    }
    

    【讨论】:

      【解决方案4】:

      get 方法的匿名函数将是异步的(根据 get 本身的执行)。

      简而言之,这一切都发生得太快了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-01
        • 1970-01-01
        • 2022-09-23
        • 1970-01-01
        • 1970-01-01
        • 2016-05-06
        • 1970-01-01
        相关资源
        最近更新 更多