Задать вопрос

Node.js: дождаться выполнения двух колбеков и запустить третий

Мне нужно дождаться реакции на 2 асинхронных запроса (скажем, fs.readFile и fs.stat) и после того, как оба будут выполнены, вызвать некоторую функцию.
Как проще всего создать адекватный семафор для этого?

Или же порекомендуете начинать выполнение второго асинхронного запроса только по завершении первого?
  • Вопрос задан
  • 4782 просмотра
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
taliban
@taliban
php программист
Я себе сделал банальную очередь. Но это в клиенском жс. Мне нужно было сделать несоколько аяксовых запросов, а затем когда все закончится выполнить один результирующий (или не один) в итоге вышла такая хрень:

var queryQueue = {
	counter: 0,
	finishEvents: [],
	push: function()
	{
		queryQueue.counter ++;
	},
	pop: function()
	{
		queryQueue.counter --;
		if( queryQueue.counter === 0 )
		{
			queryQueue.fireFinish();
		}
	},
	addFinishEvent: function( func )
	{
		queryQueue.finishEvents.push( func );
		if( queryQueue.counter === 0 )
		{
			queryQueue.fireFinish();
		}
	},
	fireFinish: function()
	{
		var func = null;
		while( func = queryQueue.finishEvents.pop() )
		{
			func();
		}
	}
}

В итоге когда делаем что-то, выполняем quertQueue.push() когда действие закончилось queryQueue.pop()
после всех пушей добавляем обработчики, которые выполнятся по окончанию всех запросов (или сразу если очередь пуста).
Вариант с флагами сразу отмел, так как при изменении количества задач придется менять количество флагов.
Ответ написан
Dzuba
@Dzuba
А банальный вариант с двумя булами не устраивает?

var firstCallFinished = false;
var secondCallFinished = false;

... вызов асинхронов ...

function firstCallback()
{
    firstCallFinished = true;
    checkFunction();
}
function secondCallback()
{
    secondCallFinished = true;
    checkFunction();
}

function checkFunction()
{
    if (!firstCallFinished || !secondCallFinished)
        return;
    firstCallFinished = false;
    secondCallFinished = false;
    ... тут вызов нужной Вам функции ...
}
Ответ написан
donnerjack13589
@donnerjack13589
io.js core developer
github.com/creationix/step

Попробуйте это библиотеку
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы