Javascript 等待用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 =

我试图让我的页面等待,直到所有数据加载并放入正确的数组。我使用3个单独的ajax调用加载数据,但由于加载有时会花费太长的时间,因此页面会在有空数组的情况下继续,在对页面执行任何操作之前,我需要这些数据

我一直在研究
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);
       })