Meteor.setTimeout не вызывает задержку
Я создаю свое первое приложение Meteor с помощью смарт-пакета Spheron. Я могу контролировать его сферо и менять его цвета, но я пытаюсь создать задержку между сменой цвета.
Вот мой код:
function makePrettyLights(sphero,color){
var colors = [];
colors['red'] = '0xB36305';
colors['green'] = '0xE32017';
colors['blue'] = '0xFFD300';
console.log(color);
var spheroPort = '/dev/tty.Sphero-OBB-RN-SPP';
var timer = 2000;
Meteor.setTimeout(function(){
sphero.on('open', function() {
sphero.setRGB(colors[lineName], false);
});
sphero.open(spheroPort);
},2000);
}
Эта функция вызывается из цикла. Я не включил цикл, который включает в себя разбор некоторых xml и других битов, но он работает.
if (Meteor.isServer) {
/**** Loop Code Here ****/
makePrettyLights(sphero,color)
/****End Loop Code ****/
}
Я также попытался установить оболочку тайм-аута вокруг функции, где она вызывается, а не внутри.
Но в основном все они выполняются в конце моего кода одновременно.
I20140806-09:49:35,946(1)? установить цвет
I20140806-09:49:35,946(1)? установить цвет
I20140806-09:49:35,946(1)? установить цвет
2 ответа
Проблема, скорее всего, в вашем цикле. Я предполагаю, что это довольно стандарт for
цикл, и в этом случае такое поведение ожидается. Когда вы звоните:
for(var i=0; i<5; ++i) {
setTimeout(someFunction, 2000);
}
setTimeout
метод будет вызываться 5 раз подряд в один момент. Это означает, что someFunction
будет вызываться 5 раз подряд после 2000 миллисекунд.
Ваш sphero
переменная выходит за пределы тайм-аута. Таким образом, каждый раз, когда открывается соединение, ранее добавленные обратные вызовы будут срабатывать в одно и то же время, так как вы просто добавляете к глобальной области sphero
переменная.
Попробуйте определить sphero
(в настоящее время не отображается с вашим кодом выше) внутри Meteor.setTimeout
обратный вызов, а не за его пределами.