Javascript 等待用ajax结果填充数组
我试图让我的页面等待,直到所有数据加载并放入正确的数组。我使用3个单独的ajax调用加载数据,但由于加载有时会花费太长的时间,因此页面会在有空数组的情况下继续,在对页面执行任何操作之前,我需要这些数据 我一直在研究Javascript 等待用ajax结果填充数组,javascript,jquery,asp.net-mvc,Javascript,Jquery,Asp.net Mvc,我试图让我的页面等待,直到所有数据加载并放入正确的数组。我使用3个单独的ajax调用加载数据,但由于加载有时会花费太长的时间,因此页面会在有空数组的情况下继续,在对页面执行任何操作之前,我需要这些数据 我一直在研究jQuery.when函数,但我似乎无法让它工作 这是其中一个ajax调用: function getWerktijden(){ var AllArrays = []; var dagen = []; var start = []; var end =
jQuery.when
函数,但我似乎无法让它工作
这是其中一个ajax调用:
function getWerktijden(){
var AllArrays = [];
var dagen = [];
var start = [];
var end = [];
$.ajax({
type: "GET",
url: '@Url.Action("getWerktijden")',
data: {
id: @Model.ID,
dag: d,
maandNr: m,
jaarNr: y,
getJson: true,
},
success: function (result) {
//console.log(result);
for(var v = 0; v < result.length; v++){
var resultItem = result[v];
var ingangsDatum = resultItem.activatieDatum;
var uitgangsDatum = resultItem.stopDatum;
if(ingangsDatum != ""){
ingangsDatum = new Date(changeDateTimeFormat(ingangsDatum));
ingangsDatum = ingangsDatum.toString('yyyy-MM-dd HH:mm:ss');
};
if(uitgangsDatum != ""){
uitgangsDatum = new Date(changeDateTimeFormat(uitgangsDatum));
uitgangsDatum = uitgangsDatum.toString('yyyy-MM-dd HH:mm:ss');
};
dagen.push({
werktijdenID: resultItem.id,
ingang: ingangsDatum,
uitgang: uitgangsDatum,
maandag: resultItem.maandag,
dinsdag: resultItem.dinsdag,
woensdag: resultItem.woensdag,
donderdag: resultItem.donderdag,
vrijdag: resultItem.vrijdag,
zaterdag: resultItem.zaterdag,
zondag: resultItem.zondag
});
start.push({
werktijdenID: resultItem.id,
ma_van: resultItem.ma_van,
di_van: resultItem.di_van,
wo_van: resultItem.wo_van,
do_van: resultItem.do_van,
vr_van: resultItem.vr_van,
za_van: resultItem.za_van,
zo_van: resultItem.zo_van,
})
end.push({
werktijdenID: resultItem.id,
ma_tot: resultItem.ma_tot,
di_tot: resultItem.di_tot,
wo_tot: resultItem.wo_tot,
do_tot: resultItem.do_tot,
vr_tot: resultItem.vr_tot,
za_tot: resultItem.za_tot,
zo_tot: resultItem.zo_tot,
})
}
}
});
AllArrays.push(dagen, start, end);
return AllArrays;
};
有人能解释一下我做错了什么吗
谢谢 返回
$.ajax
承诺,而不是每个函数的数组
数组将在ajax完成之前立即返回,因为它是异步的。另外,数组也不是一个承诺,所以$。when
不会等待它被填充
在现代浏览器中使用Promise.all()
比$.when()
更容易
所以它看起来像:
function getWerktijden() {
var AllArrays = [];
var dagen = [];
var start = [];
var end = [];
// return the promise
return $.ajax({ /* config options*/ })
.then(function(result) {
// do the processing into various arrays
// return to be used in next part of promise chain
return AllArrays;
});
}
Promise.all([getWerktijden(), getMeldingen(), getZiektedatums()])
.then(function(results){
// results will be array of whatever is returned from `then()`
// in each function and is in same order as they are called
var getWerktijden_Arrays = results[0],
dagenPerWeek = getWerktijden_Arrays[0]
console.log(dagemPerWeek);
})
@卡兰:是的,我可以,但我不想,因为那将被弃用。因此,这只是一个临时解决方案…@Karan这是一个可怕的建议和可怕的做法,永远不应该使用它。浏览器供应商也不赞成使用它,当usedI按照您的说明操作时,它会在控制台中显示警告,但没有成功:(当数组为空时,页面仍在继续,然后在所有内容的末尾显示
console.log(dagenPerWeek);
在收到所有数据之前,您可能需要显示一个加载图标。然后将其隐藏在Promise中。所有回调可能也是因为需要这些数组的脚本位于(document).ready()中)
?在函数中放置了文档的一些大部分后,ready
就可以工作了!尽管我被迫链接函数并在承诺中启动底部的第一个函数。所有的回调。谢谢!
function getWerktijden() {
var AllArrays = [];
var dagen = [];
var start = [];
var end = [];
// return the promise
return $.ajax({ /* config options*/ })
.then(function(result) {
// do the processing into various arrays
// return to be used in next part of promise chain
return AllArrays;
});
}
Promise.all([getWerktijden(), getMeldingen(), getZiektedatums()])
.then(function(results){
// results will be array of whatever is returned from `then()`
// in each function and is in same order as they are called
var getWerktijden_Arrays = results[0],
dagenPerWeek = getWerktijden_Arrays[0]
console.log(dagemPerWeek);
})