Javascript变量不会在循环外更新,在OK之内

时间:2013-02-26 08:36:22

标签: javascript jquery string variables for-loop

我希望我不会错过这里明显的东西。

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仅在data循环内从服务器根据for更新。对于console.log(viewsDomStr);,我得到的是重置为''

4 个答案:

答案 0 :(得分:3)

您正在调用的函数是异步的。

尝试

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();
        });
    }
}

答案 1 :(得分:1)

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

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

即可

答案 2 :(得分:1)

由于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);
}

答案 3 :(得分:0)

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

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