2015-07-28 2 views
1

В следующем коде я пытаюсь понять концепцию написания асинхронных функций JavaScript. Чтобы быть ясным из моих предположений:Запись асинхронного метода в Javascript (код в Node.js)

Вызывается функция logTest(). Он вызывает asyncTest(), передавая функцию log(). Однако asyncTest() не вызывает log() напрямую. Скорее, он передает его в очередь событий, вызываемую при очистке стека. Стек не должен очищаться до тех пор, пока цикл for не завершится, написав двадцать «ожидающих ...». Тем не менее, консольный вывод помещает строку «async» сначала перед циклом for. Я запустил этот код в Node.js, в котором console.log является синхронной функцией. Кто-нибудь знает, почему строка «async» не была написана последней?

function asyncCall(method) { 
    return setTimeout(method, 0); 
} 

function log(str) { console.log(str); } 

function logTest() { 
    asyncCall(log("async")); 
    for(var i = 0; i < 20; i++) { 
    log("waiting..."); 
    } 
} 

logTest(); 
+0

Возможный дубликат [Node.js Event loop] (http://stackoverflow.com/questions/25568613/node-js-event-loop) – Epicblood

ответ

4

Это потому, что вы передаете результат из log("async"), а не функции log к asyncCall.

В принципе, он выполнил log("async") (протоколирование «async» до консоли до выполнения asyncCall). Результат вызова (который равен undefined с log ничего не возвращает) передается asyncCall. Затем выполняется асинхронный вызов.

Вы можете изменить, что:

asyncCall(log.bind(null, "async")) 

или

asyncCall(function(){ 
    log("async"); 
}); 
+2

Это не отвечает на вопрос об асинхронном выполнении. Он ожидает, что строка «асинхронная» будет напечатана после строк, напечатанных в цикле, что не является правильным предположением. –

0

вы не переходящая в log("async") вы вызываете его и передавая результат в asyncCall()

как только вы добавляете (), вы, как правило, вызываете функцию. Как уже упоминалось Джозеф, вы можете пройти в любом log.bind(null, "async") (хотя я предпочитаю связывание this), или вы можете перейти в новую функцию, которая вызывает log("async") делать что-то вроде:

asyncCall(function(){ 
    log("async"); 
}); 

Однако, чтобы ответить на ваш реальный вопрос, ваш предположение о том, что «async» будет напечатано после 20 «ожидания ...» неверно. Для того, чтобы лучше понять очередь событий, я предлагаю вам прочитать this

в основном, даже если узел является технически однопоточным, он действует вроде как многопоточного приложения в, так что он может действовать, как будто он делает много вещей однажды.

+1

Это не отвечает на вопрос. –

+0

@ leo.fcx только что понял, что вы правы, обновит мой ответ – Epicblood

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