2013-12-22 5 views
1

Я новичок в JavaScript и у меня есть вопрос, касающийся функции асинхронных, когда я читал об этом в книге «JavaScript хорошие части»:Как функция-компилятор/интерпретатор знает функцию асинхронную?

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

request = prepare_the_request(); 
response = send_request_synchronously(request); 
display(response); 

Однако следующий код называется асинхронно:

request = prepare_the_request(); 
send_request_asynchronously(request, function(response){ 
    display(response); 
}); 

Как компилятор (или интерпретатор Я не уверен, как интерпретируется JavaScript) известно, что второй блок кода должен выполняться асинхронно?

Заранее спасибо.

(Если вопрос не ясно, пожалуйста, комментарий и я сожалею, что не выразить это ясно.)

+2

Невозможно явно указать функции для запуска асинхронной работы, только некоторые встроенные методы асинхронны, такие как XMLHttpRequest, setTimeout и setInterval, все остальные функции будут выполняться синхронно, так как javascript является однопоточным, и нет возможности запускать что-то асинхронное, кроме обмана с тайм-аутами. Приведенные вами примеры просто показывают обычный синтаксис таких функций и не имеют никакого отношения к мошеннику или нет, они асинхронны или нет. – adeneo

+0

Как сказал adeneo: Использование обратного вызова не предполагает асинхронного поведения; это должно быть добавлено источником родных событий. Кроме того, обратные вызовы могут быть не очевидны с асинхронными источниками, которые возвращают обещания. В соответствующей документации должно быть разъяснено, как ведет себя эта функция. – user2864740

+0

@adeneo Благодарим вас за ответ. Итак, для вышеупомянутой функции (send_request_asynchronously()), я должен использовать эти асинхронные методы внутри определения для достижения асинхронного вызова? – Ra1nWarden

ответ

1

Компилятор/переводчик не знает, что и на самом деле не заботится об этом. В многопроцессорных операционных системах два или более потока могут выполняться одновременно, а объект XMLHTTPRequest Javascript позволяет запускать запрос в отдельном потоке. Таким образом, Javscript запускает поток, но поскольку он работает в отдельном потоке, он не ждет и продолжает следующую команду.

0

Я буду полностью честным ... первый раз, когда я прочитал, что же Callbacks раздел на странице 53 Javascript, хорошие части, я сделал то же самое предположение, как вы делали хахаха, но только позже я понял, что имел в виду автор.

Ваше предыдущее заявление не на самом деле правильно:

Однако следующий код называется асинхронно:

Перед Автор показывает код с помощью функции обратного вызова, он говорит нижеследующий пункт:

Лучшим подходом является создание асинхронного запроса, обеспечивающего функцию обратного вызова , которая будет вызывается, когда ответ сервера равен . Асинхронная функция возвращает сразу, поэтому клиент не заблокирован:

Важную роль здесь: ... сделать асинхронный запрос, ПРЕДОСТАВЛЕНИЕ функцию обратного вызова ...

Автор пытаюсь сделать точку, что вы могли бы сделать такую ​​функцию:

send_request_asynchronously(request, function (response) { 
display(response); 
}); 

, что не выполняет function (response) {display(response);} в то время код запускается через переводчик, а через некоторое время в будущем, когда вызывается код send_request_asynchronously И позже в коде вы можете сделать его асинхронным. Сам код сам по себе не имеет ничего асинхронного. Он разработан для асинхронного вызова позже.

«ПРЕДОСТАВЛЕНИЕ функции обратного вызова» является ключом к выводу, что это то, что имел в виду автор. Если вы заметили, после функции обратного вызова нет конца (). Если вы имели косую () вроде так:

send_request_asynchronously(request, function (response) { 
display(response); 
}());//<--- right here 

то функция будет выполнять прямо там и тогда, когда интерпретатор читает через ту часть кода, следовательно, заставляя систему быть S ynchronous, где поскольку, не включая (), вы открываете дверь для нее A синхронно в будущем, реализуя код с асинхронными функциями, которые затем вызывают эту функцию.

В качестве окончательного важного момента, помните, что это то, что делает функцию обратного вызова функцией обратного вызова. Он не вызывается, когда вы включаете функцию в параметр. Так, например, если я функция под названием приветствий:

var salutations = function (hello(){alert('hi')}) 
{ 
    alert ('salutations!'); 
} 

, и если у меня не было больше коды после предыдущего кода, вы никогда не увидите уведомление всплывающего окна. Он будет вызываться только при вызове/вызове после его объявления/инициализации (HENCE: термин «он вызывается» после того, как был создан обратный вызов AKA). Однако, если бы я включил конечный () после функции обратного вызова, он затем заставил бы функцию фактически выполнять во время объявления и инициирования функции salutations.

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