2015-07-29 2 views
1

Я использую async.js 'queue, и я не уверен, что я должен обрабатывать каждую задачу по одному или нет. Сама задача - это простое и быстрое сообщение, отправленное в сокет.Должен ли я использовать обратный вызов при использовании асинхронной очереди?

process: (task, done) -> 
    task.client.send(task.model, done) 

против

process: (task, done) -> 
    task.client.send(task.model) 
    done() 

ответ

3

Правильный ответ: "это зависит".

Обратный вызов done должен быть вызван внутри функции задачи, когда задача завершена, чтобы сообщить очередь о ее завершении.

Операция async task.client.send, поэтому она будет завершена в ближайшем будущем. По этой причине в качестве второго аргумента есть обратный вызов, который может быть использован вызывающим абонентом, чтобы узнать, когда операция отправки будет завершена.

Если для вас, задача выполнена, когда запрос посыла закончился, вы должны пройти done обратный вызов task.client.send как в:

process: (task, done) -> 
    task.client.send(task.model, done) 

Если для вас, задача завершается, когда посыла работа начинается, вы должны назвать его после task.client.send как в:

process: (task, done) -> 
    task.client.send(task.model) 
    done() 

в этом случае задача может считаться завершенным до операции отправки завершена.

Недостаток я вижу во втором случае (один с done вызова после send вызова) является то, что вы не имеете контроль над параллелизм из send вызовов. Уровень параллелизма по умолчанию для метода Async.js queue равен 1, поэтому во втором случае выполняется вызов send до того, как предыдущий закончен. По этой причине все запросы send могут быть запущены одновременно, и вы не можете их ограничить.

В первом случае (done в качестве второго аргумента send) у вас есть лучший контроль над send запроса и может контролировать уровень параллелизма, используя queue второй аргумент (concurrency).

+0

Спасибо за объяснение, но это не говорит мне ничего, чего я еще не знаю. Я знаю, как работают обратные вызовы, тогда мой вопрос в этом контексте был бы тогда, когда я должен был рассмотреть задачу? Могу ли я просто асинхронно отправлять много, или было бы лучше отправить их по одному, т. Е. дожидаться обратного вызова перед отправкой следующего? – rtheunissen

+0

@ параноидальный андроид, вам действительно нужно предоставить дополнительную информацию, прежде чем кто-нибудь сможет ответить на этот вопрос. – robertklep

+0

Просто отредактировал ответ, пытаясь лучше ответить на ваши сомнения ... Дайте мне знать, что вы думаете ... – Andrea

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