Это будет запускаться каждый раз, когда будет найдено совпадение в config.PowerDevices. Я хочу установить интервал между ними, чтобы он проверял только каждые 30 секунд. Как я могу это сделать? Я пробовал несколько вещей здесь, на форуме, но он все равно срабатывает каждый раз, когда есть совпадение.
это часть моего бота Discord.
for (var i in config.PowerDevices) {
if (myData.ref == config.PowerDevices[i].ref) {
var PowerDevicesType = config.PowerDevices[i].type; // type of the device show
var PowerDevicesName = config.PowerDevices[i].name; // Custom name show
const got = require('got');
got("http://" + IP.IP + ":" + PORT.PORT + "/JSON?request=getstatus&ref = " + myData.ref)
.then(response => {
let content = JSON.parse(response.body);
console.info("content.Devices[0].status");
}).catch(console.error);
}
}





Для этого вам понадобится так называемый шаблон проектирования времени жизни (TTL). Вот что вы делаете: сохраняйте объект nextTime, показывающий, когда в следующий раз каждый элемент .PowerDevices будет готов к проверке. Что-то вроде этого.
const got = require('got');
const howOften = 30000; /* half minute */
if (!global.nextTime) global.nextTime = {}; /* first time initialization */
const now = Date.now();
for (var i in config.PowerDevices) {
if (myData.ref == config.PowerDevices[i].ref) {
if (!global.nextTime[i] || global.nextTime[i] < now) {
/* it's time to check this one. So check it. */
var PowerDevicesType = config.PowerDevices[i].type; // type of the device show
var PowerDevicesName = config.PowerDevices[i].name; // Custom name show
got("http://" + IP.IP + ":" + PORT.PORT + "/JSON?request=getstatus&ref = " + myData.ref)
.then(response => {
let content = JSON.parse(response.body);
console.info("content.Devices[0].status");
/* set the time-to-live 30s in the future. */
global.nextTime[i] = now + howOften;
}).catch(console.error);
}
else {
/* skipped the check on device i: too soon */
}
}
}Объект global.nextTime изначально пустой. Затем, когда вы перебираете свой объект .PowerDevices, вы проверяете, отсутствует ли его запись в global.nextTime или она до настоящего времени, с помощью этой строки. Если да, то готов к проверке.
if (!global.nextTime[i] || global.nextTime[i] < now) {
Наконец, когда проверка завершится, вы устанавливаете global.nextTime[i] = now + howOften, чтобы показать, когда эта запись может быть проверена снова.
Заметьте, что мое использование global. - не лучший стиль. Лучше поместить объект nextTime в область видимости модуля. Но вы не показали, как собираются ваши модули, поэтому я выбрал глобальный объект.
Совет от профессионала: не помещайте операции require() в циклы. Это не вредит, но немного замедляет работу.
Большое спасибо за объяснение !! работает отлично !!!