Обратный вызов в обратном вызове node-schedule

В моем приложении 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)
    })
  });
};

Рассматривали ли вы использование обещаний или async-await для управления потоком вашей функции Job? Рассматривали ли вы использование гораздо более простой методологии setInterval для того, чтобы ваше задание выполнялось по такому регулярному графику (по крайней мере, во время разработки)? Задумывались ли вы, как выполнение задания каждую секунду предотвратит масштабирование вашего приложения?

O. Jones 08.01.2019 12:39

@ O.Jones Я решил проблему с async-await. В производстве мы планируем 1-минутный график. Я также чувствую, что это планирование очень ресурсоемко, но, как я уже писал в комментарии: проблема в том, что мне нужно отправить электронное письмо, если билет открыт в течение определенного времени (отличается от билета к билету). Например. Если ticke1 открыт в течение 30 минут, а ticket2 открыт в течение 45 минут, необходимо отправить электронное письмо. Банкомат Лучшего решения не вижу.

user3568719 08.01.2019 13:11
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
221
1

Ответы 1

Не считайте так все открытые тикеты - это стоит больших ресурсов.

Вы должны сохранить номер тикета в вашем 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 не поддерживает асинхронные вызовы». Есть ли у вас какие-либо предложения, как я могу преодолеть это или другую библиотеку планирования?

user3568719 08.01.2019 12:21

Другие вопросы по теме