我希望我不会错过这里明显的东西。
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);
,我得到的是重置为''
。
答案 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
本身的执行)。
简而言之,这一切都发生得太快了。