2012-03-29 5 views
2

Первый день при программировании в узле сегодня. Я хорошо ласкаю весь день, но у меня что-то странное. Возможно, я не понимаю асинхронизацию узла или что-то в этом роде.Порядок выполнения кода Node.js

У меня есть функция, которая выполняет команды оболочки:

function puts(error, stdout, stderr) { sys.puts(stdout); }

Затем я выполнить некоторые команды:

exec("foo", puts); 
myarr.keys("mykey", function (err, replies) { 
    replies.forEach(function (reply, i) { 
     exec("bar"); 
    }); 
}); 
exec("fuzz", puts); 
exec("buzz", puts); 

поэтому две последние вещи, которые предназначены для исполнения являются fuzz и затем buzz. Однако кажется, что fuzz и buzz происходят в некоторой случайной точке цикла, а bar - это то, что печатается последним (иногда). myarr - массив, который я создаю, подключившись к базе данных Redis.

Должен ли я вынуждать Node делать петлю синхронно или что-то в этом роде? Я использую Redis клиентов в коде .. могут ли это вызвать проблемы? Есть идеи? Большое спасибо :).

ответ

3

myarr.keys() выполняет обратный вызов, который не будет выполнен до завершения запроса redis.

Если вам нужно «пуха» и «шум», чтобы выполнить после того, как тогда, и после цикла, переместить их в функцию обратного вызова, например, так:

exec("foo", puts); 
myarr.keys("mykey", function (err, replies) { 
    replies.forEach(function (reply, i) { 
     exec("bar"); 
    }); 
    exec("fuzz", puts); 
    exec("buzz", puts); 
}); 

Важно отметить, что myarr.keys() возвращает мгновенно (ну, после того, как он отправил запрос redis). Это позволяет продолжить работу с другими материалами, а не блокировать процесс. Функция обратного вызова - это то, как вы указываете код для обработки ответа от redis, который может появиться в любой момент в будущем.

+0

Спасибо - хорошо поймали :). – ale

+1

Просто был там много раз перед собой :) Счастливый взлом узла. – MattJ

1

Использование exec приводит к тому, что эти операции выполняются асинхронно. Возможно, вы захотите изучить пакет fs для синхронных эквивалентов. В качестве альтернативы вам может понадобиться изучить способ укладки ваших команд до их выполнения в одной партии

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