请协助。
我正在尝试访问在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) 原始:对象
答案 0 :(得分:1)
这里的问题是setTimeout
函数正在立即运行函数checkMachineState()
,而不是等待5秒钟。
这是因为setTimeout
需要一个功能名称(即仅checkMachineState
而没有()
)。但是输入的是一个函数表达式(一个以()
结尾的函数,遇到该JavaScript并将其解析为值时将运行该函数)。
但是您需要带括号才能传递参数odata
和INTERVAL
。解决方案是将函数包装在匿名的 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);