2017-01-07 2 views
3

Существует глобальная переменная window.listNodes, которая представляет собой массив. Эта переменная обновляется каждые 3 секунды и заполняется последовательно.JavaScript: приостановить функцию и ждать глобальной переменной

Другая функция onOpen() запускается пользователем и должна иметь глобальную переменную window.listNodes, содержащую 3 элемента, не менее. То, что я пытаюсь сделать: если глобальная переменная не имеет .length, равную 3, тогда программа ожидает, что другая часть кода заполняет window.listNodes, а затем снова запустит функцию onOpen().

socket.onopen = function onOpen() { 
     if (window.listNodes.length === 3) { 
      // Do something 
     } else { 
      // Wait and when window.listNodes.length === 3: 
      onOpen(); 
     } 
    }); 
}; 

Есть ли простой способ сделать это? Я попытался с функцией setTimeOut() и с функцией генератора и ключевым словом yield, но мне не удалось.

Благодарит Вас за драгоценную помощь :)

+0

_I пытался с функцией 'setTimeOut'_ Я показал в своем ответе, как это можно сделать с помощью' setTimeout'. Как ты сделал это? –

ответ

3

Это может использовать setTimeout и пользовательский интервал ожидания, например, 500мс, чтобы сделать это:

function onOpen() { 
     if (window.listNodes.length === 3) { 
      // Do something 
     } else { 
      // Wait and when window.listNodes.length === 3: 
      setTimeout(onOpen, 500); 
     } 
    }); 
}; 

socket.onopen = onOpen; 
1

обещаниями:

function getListNodes() { 
    return new Promise(function check(resolve) { 
    if (window.listNodes.length === 3) { return resolve(window.listNodes); } 
    setTimeout(() => check(resolve), 500); 
    }); 
} 

socket.onopen = async function() { 
    const listNodes = await getListNodes(); 
    // use listNodes normally 
}; 

В функции async ключевое слово await приостанавливает выполнение функции до тех пор, пока не будет разрешено обещание, ожидаемое для него (или r выбрасываются).

Promise, возвращенный с getListNodes(), будет повторять поиск каждые 500 миллисекунд и разрешить, если обнаружит, что длина достаточна.

Обратите внимание, что изначально функции async поддерживаются только в Chrome и Edge. Вам понадобится полигон Babel + Babel, чтобы использовать их повсюду.

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