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 обратный вызов, а не за его пределами.

Другие вопросы по тегам