2013-09-27 4 views
0

функцию обратного вызова:Обратный вызов не выполняется асинхронно в Node.js

function queryDemo(param,callBack){ 
    function sleep(milliSeconds) { 
     var startTime = new Date().getTime(); 
     while (new Date().getTime() < startTime + milliSeconds); 
    } 
    sleep(10000); 
    callBack(param); 
} 

Экспресс код:

app.get('/demo', function(req, res){ 
    console.log(1); 
    queryDemo(JSON.stringify(req.query),function(result){ 
     console.log(2); 
    }); 
    console.log(3); 
}); 

Затем перейдите http://127.0.0.1/demo, выход в консоли

1 
//wait 10 seconds here 
2 
3 

Я думаю, правый выход должен быть:

1 
3 
// 10 seconds later 
2 

ответ

3

Обратный вызов будет выполняться синхронно, если вы не поставите его в очередь для запуска на следующей итерации цикла событий. Это то, для чего используется process.nextTick().

function queryDemo(param, callback) { 
    function sleep(milliseconds) { 
    var startTime = new Date().getTime(); 
    while (new Date().getTime() < startTime + milliseconds); 
    } 
    sleep(10000); 
    process.nextTick(function() { 
    callback(param); 
    }); 
} 

Однако, если вы используете это, вы по-прежнему блокировать приложения и получить этот результат:

1 
// 10 second pause 
3 
2 

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

process.nextTick(function() { 
    queryDemo(JSON.stringify(req.query), function(result) { 
    console.log(2); 
    }); 
}); 

Также стоит обратить внимание, что ваша sleep() функция будет по-прежнему блокировать приложения, так что вы должны использовать setTimeout() вместо этого.

+0

Точка для добавления: даже OP использует обратный вызов, вызов не является асинхронным. – leesei

1

Я думаю, что вы убиваете нить этой плотной петлей. Почему вы пытаетесь написать собственную функцию сна вместо built in timerssetTimeout или setInterval?

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