【问题标题】:Array returns empty before getting fullfilled [duplicate]数组在填充之前返回空[重复]
【发布时间】:2021-10-04 04:16:09
【问题描述】:

我正在我的 php/js 应用程序中实现 Toast Ui 日历,并且在 javascript 执行流程中,程序遇到了这个函数:

function setSchedules() {
    cal.clear();
    generateSchedule();
    cal.createSchedules(ScheduleList);
    refreshScheduleVisibility();
}

当我刷新页面以可视化通过 axios 和 php 函数从 db 检索的事件时,日历为空,然后如果选择月份视图或返回一周并返回当前一周,则呈现事件。

问题接缝存在于函数 generateScedule() 中,该函数在 schedules.js 文件中声明,并声明并实现 ScheduleList 数组以传递给 createSchedules 函数,请遵循以下代码:

var ScheduleList = [];
function generateSchedule() {
axios({
  method: 'post',
  url: 'path-to-data',
})
.then(function (response) {
  ScheduleList = [];
  let data = response.data;
  for(let key in data){
    ScheduleList.push(data[key]);
  };
})
.catch(function (error) {
 console.log(error);
});
 return ScheduleList; //with or without this return the result doesn't change
}

这就像如果数组 ScheduleList 一开始返回空(没有等待),而函数仍在执行它,console.log 在函数的各个部分确认它。

如果我用粘贴的 json 数据手动完成数组,一切都会立即返回。

我知道这可能与 javascript 堆栈等有关。

任何帮助将不胜感激。

提前非常感谢!

【问题讨论】:

    标签: javascript asynchronous async-await promise axios


    【解决方案1】:

    因为 axios 是异步的,所以 ShceduleList 保持为空, return 在数据循环之前执行。

    试试这个:

    function generateSchedule() {
      return axios({
        method: 'post',
        url: 'path-to-data',
      })
        .then(function (response) {
          var ScheduleList = [];
          let data = response.data;
          for (let key in data) {
            ScheduleList.push(data[key]);
          };
          return ScheduleList;
        })
        .catch(function (error) {
          console.log(error);
        });
    }
    

    【讨论】: