#node.js
#node.js
Вопрос:
Я создаю это приложение, в котором каждый пользователь может выполнить функцию в моем node.js сервер, функция представляет собой цикл, который продолжает выполняться и обновлять базу данных. Моя цель — найти способ остановить функцию, выполняемую пользователем, чтобы дать вам представление о логике, которую я уже реализовал, пожалуйста, посмотрите код ниже :
app.get('/api/v1/', cors(), (request, response) => {
let timer = setInterval(apiCall, interval);
if (request.query.running === false) {
clearInterval(timer);
}
function apiCall(i) {
webshot(url, 'public/' filename, options, function (err) {
if (err) { console.log(err) }
});
}
})
Я планировал отправить вызов API с running = false, чтобы остановить его, но, похоже, это не работает, это просто создает другой поток
Ответ №1:
Ваш подход работает, с несколькими улучшениями и изменениями в логике:
- Вы должны сравнить с ‘false’ вместо false или проанализировать / вычислить строку запроса.
- Областью действия вашей
timer
переменной должен быть весь веб-процесс. Если вы объявите ее внутри функции, вы потеряете ссылку на нее, чтобы использовать ее позже вclearInterval
. - Ваш
setInterval
должен находиться внутри предложения else, иначе вы отмените его и запустите снова в том же вызове. - В вашем примере не была определена
interval
переменная. Я изменил ее на 2 секунды.
После этого изменения ваш пример работает. Проверьте это:
var express = require('express');
var app = express();
var timer;
function apiCall(i) {
console.log("api called " Date());
}
app.get('/api/v1/', (request, response) => {
if (request.query.running === 'false') {
clearInterval(timer);
console.log('Timer stopped');
} else {
console.log('Timer started');
timer = setInterval(apiCall, 2000);
}
response.send(200);
})
app.listen(3000);
Конечно, у этого решения есть проблема: оно не будет различать пользовательские вызовы: это означает, что если несколько пользователей вызывают конечную точку вашего API, все они будут взаимодействовать с одним и тем же таймером. Если вам нужны разные таймеры для каждого пользователя, вам придется добавить логику внутри вашего api, чтобы определить, какой пользователь совершил вызов, и, конечно, иметь разные таймеры для каждого пользователя. Проще всего было бы добавить имя внутри вызова API: /api/v1/john/
и вместо timer
переменной иметь сопоставление с переменной timer для каждого пользователя. С уважением!
Комментарии:
1. Спасибо за ответ, это правда, что я должен рассматривать false как строку, мне также нравится идея добавления пользователя в path, таким образом, я могу настроить таргетинг на конкретные конечные точки