В моем приложении loopback (на основе express.js) я хочу запланировать запуск задачи каждые 1 секунду. Он должен подсчитывать все открытые тикеты, и если они уже открыты в течение определенного времени, следует отправить электронное письмо. Ниже приведен упрощенный код.
Проблема в том, что 'scheduleJob' регистрируется, как и ожидалось, а количество билетов - нет. Я думаю, это проблема контекста. Как мне записать номер найденного билета? Как мне передать обратную связь от обратного вызова count к обратному вызову schedule?
var schedule = require('node-schedule');
module.exports = function(app) {
var Ticket = app.models['Ticket']
var j = schedule.scheduleJob('* * * * * *', function(){
console.info('scheduleJob')
Ticket.count(function(err, count){
if (err) {console.info(err)}
console.info(count)
})
});
};
@ O.Jones Я решил проблему с async-await. В производстве мы планируем 1-минутный график. Я также чувствую, что это планирование очень ресурсоемко, но, как я уже писал в комментарии: проблема в том, что мне нужно отправить электронное письмо, если билет открыт в течение определенного времени (отличается от билета к билету). Например. Если ticke1 открыт в течение 30 минут, а ticket2 открыт в течение 45 минут, необходимо отправить электронное письмо. Банкомат Лучшего решения не вижу.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Не считайте так все открытые тикеты - это стоит больших ресурсов.
Вы должны сохранить номер тикета в вашем node.js и увеличивать / уменьшать его. Если у вас есть несколько процессов, взаимодействующих с базой данных, сделайте один из них своим главным и пусть он справится с этой задачей.
По поводу вашей проблемы, похоже, что библиотека node-schedule не поддерживает асинхронные вызовы.
Алгоритм
При запуске программы найдите билет в своей базе данных и получите следующую временную метку, когда вам следует отправить электронное письмо.
Например, вы хотите отправить электронное письмо, если билет открыт в течение 1 часа, и в вашей базе данных есть:
ticket 1 / 10 min
ticket 2 / 40 min
Таким образом, ваше следующее письмо должно быть отправлено через 20 минут (60–40 минут).
используйте setTimeout(), чтобы разбудить ваш узел через 20 минут. Когда вы проснетесь, отправьте письмо и еще раз посмотрите в своей базе данных в поисках следующего письма для отправки.
Пересчитайте свой setTimeout, если в вашу базу данных добавлен новый билет или если он был удален / обновлен.
Проблема в том, что мне нужно отправить электронное письмо, если билет открыт в течение определенного времени (отличается от билета к билету). Например. Если ticke1 открыт в течение 30 минут, а ticket2 открыт в течение 45 минут, необходимо отправить электронное письмо. «Насчет вашей проблемы, похоже, библиотека node-schedule не поддерживает асинхронные вызовы». Есть ли у вас какие-либо предложения, как я могу преодолеть это или другую библиотеку планирования?
Рассматривали ли вы использование обещаний или async-await для управления потоком вашей функции Job? Рассматривали ли вы использование гораздо более простой методологии setInterval для того, чтобы ваше задание выполнялось по такому регулярному графику (по крайней мере, во время разработки)? Задумывались ли вы, как выполнение задания каждую секунду предотвратит масштабирование вашего приложения?