2013-02-26 61 views
1

我希望我不会错过这里明显的东西。Javascript变量不会更新循环外部,OK内部

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);我得到的是重置为''

+1

你得到的是一个Ajax请求。回拨到您的console.log – ryadavilli 2013-02-26 08:37:52

回答

1

问题是$.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即可。

+0

时不会执行。我不想在循环的每一个回合中使用jQuery的append方法。这就是为什么我使用连接字符串。 – Pejman 2013-02-26 08:47:26

+0

那是怎么回事?你可以使用你从请求中获得的数据对象,不需要viewsDomStr。 – 2013-02-26 08:52:16

+0

是的,我想添加一次,但似乎逐一添加它是最佳的解决方案。 – Pejman 2013-02-26 09:11:17

0

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

总之,这一切发生得太快。

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

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