2016-12-19 2 views
0

В настоящее время работает над проектом с использованием Websockets и node.js. На данный момент я генерирую некоторые случайные числа и отправляю их клиенту каждые полсекунды.Извлечение переменной из области обработчика событий

var array = []; 

wss.on("connection", function (ws) { 
    setInterval(function() { 
     var data = Math.floor(Math.random() * 100) + 1; //create a random whole number between 1-100 
     var msg = JSON.stringify(data);      //convert data to JSON string 
     ws.send(msg);          //send JSON string to client 
    }, 500); 


}) 

Однако теперь я хотел бы каждую минуту хранить значение в эту минуту в базе данных. Я не хочу вставлять свои вставки в mongodb в функцию wss.on, поскольку это кажется грязным. Есть ли способ для меня получить значение data вне сферы действия wss.on и в array?

Я пытался использовать array.push(), но, очевидно, это не сработало. Любая помощь и ссылки на необходимые чтения по этому вопросу были бы весьма признательны.

+1

То, что вы считаете «грязным», является правильным способом сделать это. Гнездо это. Если вы действительно этого хотите, вы можете поместить вставку в отдельную функцию и вызвать ее из sindie. Асинхронное время действует только в обратном вызове async, поэтому вы выполняете свою работу. Вы можете поместить 'data' в массив с более высоким охватом и сохранить его там, но время, когда значение только что было добавлено в массив, ТОЛЬКО известно внутри обратного вызова' setInterval() '. – jfriend00

+0

Спасибо! Планировал обернуть мою вставку в функцию и сделать ее таким образом, если все остальное не получилось. Просто хотел убедиться, что есть более эффективный способ сделать это, прежде чем я попытаюсь это сделать. – Jambo

ответ

1

Оформить свой комментарий в ответе, так как он оказался тем, что вы искали.

То, что вы считаете «грязным», является правильным способом сделать это. Гнездо это. Если вы действительно этого захотите, вы можете поместить вставку в отдельную функцию и вызвать ее изнутри интервала. Асинхронное время действует только в обратном вызове async, поэтому вы выполняете свою работу. Вы можете поместить данные в массив с более высоким охватом и сохранить его там, но время, когда значение только что было добавлено в массив, ТОЛЬКО известно внутри обратного вызова setInterval().

+0

Это, вероятно, звучит глупо, но если мне не нужно знать время, когда значение для массива. Как передать данные в массив с более высоким охватом, чтобы другие части моего приложения могли использовать эти значения? – Jambo

+0

@Jambo - Вы можете '.push()' данные или иным образом назначить его в более высокие переменные с областью видимости, и она будет находиться в этой более высокой области. Вы просто не узнаете, когда сможете использовать его из более высокой области, если у вас нет какой-либо системы уведомлений: callback, eventEmitter, обещание и т. Д. Обычно, когда люди, новые для node.js, пытаются это сделать, они делают ошибку программирования, потому что они не понимают асинхронное время. – jfriend00

+0

Так что были возились с обещаниями, обратными вызовами и функциями, чтобы попытаться получить мои желаемые результаты и потерпели неудачу с жадностью (также, если этот вопрос не должен быть здесь, пожалуйста, дайте мне знать). На данный момент мой единственный сценарий Node служит пользователю веб-странице, а затем, используя веб-раскладку и задавая интервал, отталкивающий данные каждую секунду, должен ли я разделить его на два сценария? который получает данные с сервера websocket, а затем вставляет его в мой mongoDB каждую минуту и ​​5 минут? или я должен обрабатывать это на стороне клиента с моей html-страницей? Я довольно новичок в асинхронном программировании извинения – Jambo

Смежные вопросы