There are 999 reasons to become levi niner. Find yours at levi9.com/jobs
×Закрыть

Как обновить переменную через setTimeout?

Здраствуйте.
У меня вопрос, как можно обновить переменную через setTimeout?
Суть заключается в том, что нужно через этот метод делать запрос на сервер и получать сообщения для чата.
Я хочу реализовать отображение новых сообщений в чате через проверку длины сообщений.

Я прошу просто объянить как это корректно сделать. Вот код:

var defaultMessagesLength; // создаю переменную, в которой хранится старая длина сообщений
 
    function checkMessages() {
 
        var a = setInterval(function () {
            var messagesNewArray = JSON.parse(authentication.getMessages()); //делаю запрос новых сообщений
            let currentMessagesLength = messagesNewArray.length; //определяю длину новых сообщений
            defaultMessagesLength = messagesArray.length; // присваиваю длину старых сообщений - они берутся с внешней функции
 
           if(defaultMessagesLength!==currentMessagesLength) { //делаю проверку длин, если не равны, то выполняется код (я думаю это не принципиально какой)
 
              //выполнение кода
 
               }
 
           //после выполнения кода я хочу переприсвоить значение старой длины на новую
 
            defaultMessagesLength=currentMessagesLength;
 
        },3000);
 
    }
 
    checkMessages();

Но при отладке в консоле значение переменной не изменяется.
Как правильно можно передать значение новой длины в старую?
Заранее спасибо.

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Незнаю, але в мене ваш код працює. Мжливо проблема в методі getMessages() або у messagesArray.length. Ось мій код з тестовими функціями. все працює. Може ви щось для себе тут знайдете.

var defaultMessagesLength; // создаю переменную, в которой хранится старая длина сообщений

// \/ для теста
var fakeMessagesArray = ['mes1','mes2','mes3']
var fakeMesNewArray = ['mes1','mes2','mes3']
function fakeGetMessage (arr) {
  var lastMes = fakeMesNewArray[fakeMesNewArray.length - 1].split('')
  lastMes[3]++
  var newMes = lastMes.join('')
  arr.push(newMes)
  return arr
} 
// /\ для теста

function checkMessages() {
  var a = setInterval(function () {
    //var messagesNewArray = JSON.parse(authentication.getMessages()); //делаю запрос новых сообщений

    var messagesNewArray = fakeGetMessage(fakeMesNewArray)// <= для теста !!!

    var currentMessagesLength = messagesNewArray.length; //определяю длину новых сообщений

    //defaultMessagesLength = messagesArray.length; // присваиваю длину старых сообщений - они берутся с внешней функции 

    defaultMessagesLength = fakeMessagesArray.length; // <= для теста !!!

    if(defaultMessagesLength!==currentMessagesLength) { 
      console.log('not equal'); // loger
    }

    //после выполнения кода я хочу переприсвоить значение старой длины на новую
    defaultMessagesLength=currentMessagesLength;

    console.log('defaultMessagesLength now === ', defaultMessagesLength); // loger
    
  },1000);
}

checkMessages();

вместо var лучше let использовать

Лучше посылай на сервер в запросе время последней месаги в клиенте чата, и присылай в ответе новые, созданные после этого времени.

Контекст захватывается, должно обновляться, проверьте логику до присваивания, если в js как везде

вот эта строка точно выполняется?

defaultMessagesLength=currentMessagesLength;

Код доходит до нее или сыпется раньше?

Да. Поправил. Надо было вынести переменную за функцию. Теперь все работает. Спасибо.

Подписаться на комментарии