Как получить доступ к переменной, инициализированной в функции обратного вызова Ajax? - PullRequest
1 голос
/ 18 мая 2019

Пожалуйста, помогите.

Я пытаюсь получить доступ к объектной переменной, которая была объявлена ​​вне функции 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: Объект даты: [] идентификаторы: Array (0) длина: 0 proto : Array (0) proto : Объект

1 Ответ

1 голос
/ 19 мая 2019

Проблема здесь в том, что функция setTimeout запускает функцию checkMachineState() немедленно, вместо ожидания 5 секунд.

Это потому, что setTimeout ожидает имя функции (т.е.просто checkMachineState без ()).Но то, что введено, это выражение функции (функция с закрытием (), который будет запускаться javascript и принимать значение).

Но для передачи параметров odata и INTERVAL необходимо иметь круглые скобки.Решение состоит в том, чтобы обернуть вашу функцию в анонимное объявление функции (объявление функции обычно не приводит к ее запуску), например:

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);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...