如何访问在Ajax回调函数中初始化的变量?

时间:2019-05-18 20:07:06

标签: javascript jquery ajax datatables

请协助。

我正在尝试访问在JQuery DataTable()函数外部声明的对象变量。我已经为Ajax对象提供了设置,其中,当请求成功完成时,将执行一个回调函数。由于不建议使用async:false,因此我决定使用setTimeout()从外部的回调函数访问初始化的变量。请查看我的代码以澄清我的问题。

var odata = {
 ids: [],
 dates: []
};
var table = $("#schedule");
table.DataTable({
 ajax: {
   url: "/api/MaintenanceSchedule",
   dataSrc: "",
   complete: function (data, status) {
       if (status === "success") {
         //some codes here
       }

       $("span.machineIds").each(function (index) {
           machineIds[index] = $(this).attr("data-machine-id");//here the array output all elements if you check with console.log()
       });

       $("span.lastMaintained").each(function (index) {
           lastMaintained[index] = $(this).attr("data-last-maintained");
        });

       //the odata properties below have assigned values as seen from the debugger window
       odata = {
          ids: machineIds,
          dates: lastMaintained
       };                           
   }

//some other codes ...

//outside DataTable object

var checkMachineState = function (odata, interval) {
  // some codes...
}

 const INTERVAL = 45000;

setTimeout(checkMachineState(odata,INTERVAL),5000);//odata properties are still not initialized as seen from the debugger

调试器显示以下内容

odata:对象 日期: [] ids:数组(0) 长度:0 proto :数组(0) 原始:对象

1 个答案:

答案 0 :(得分:1)

这里的问题是setTimeout函数正在立即运行函数checkMachineState(),而不是等待5秒钟。

这是因为setTimeout需要一个功能名称(即仅checkMachineState而没有())。但是输入的是一个函数表达式(一个以()结尾的函数,遇到该JavaScript并将其解析为值时将运行该函数)。

但是您需要带括号才能传递参数odataINTERVAL。解决方案是将函数包装在匿名的 function声明中(声明一个函数通常不会导致其运行),如下所示:

setTimeout(() => {checkMachineState(odata,INTERVAL)},5000);

运行下面的代码,了解我的意思

console.log("start");
setTimeout(console.log("This runs immediately because of the ()"),10000); //even if delay is 10 seconds

setTimeout(() => console.log("This waits 5 seconds before firing"), 5000);

我已经用ES6箭头符号编写了上面的代码。您也可以将其编写为:

setTimeout(function() {checkMachineState(odata,INTERVAL)},5000);