Как обратные вызовы кодируются в Javascript, за кулисами? - PullRequest
0 голосов
/ 19 октября 2019

Как функция узнает, что что-то является обратным вызовом;что-то, что должно быть выполнено после завершения определенного ввода-вывода. Откуда он знает, что он не должен выполняться сразу? Определено ли оно в функции (стандартизированным) образом?

Насколько я знаю, ключевое слово callback, которое часто используется в аргументе, является обычной практикой, но не позволяет функции автоматически интерпретироватьаргумент как нечто, которое должно начинаться после завершения определенного ввода-вывода.

Используя приведенный ниже пример, у меня есть два вопроса (взяты из https://medium.com/codebuddies/getting-to-know-asynchronous-javascript-callbacks-promises-and-async-await-17e0673281ee):

const request = require(‘request’);
function handleResponse(error, response, body){
    if(error){
        // Handle error.
    }
    else {
        // Successful, do something with the result.
    }
}
request('https://www.somepage.com', handleResponse);
  1. Как выглядит структура функции 'require', чтобы она знала, что аргумент 2 (в данном случае handleResponse) должен быть выполнен после завершения запроса? Я полагаю, это сводится к тому же вопросу, который я задавал выше.

  2. Могут ли функции быть асинхронными даже без ключевого слова async в функции? Если да, как браузер узнает, что это асинхронная функция?

1 Ответ

1 голос
/ 19 октября 2019
  1. Полагаю, вы хотели спросить о функции request. Большинство асинхронных функций вызывают другие асинхронные функции для выполнения некоторой работы, а затем вызывают обратный вызов. Вы можете думать об этом как о цепочке функций и обратных вызовов. Это то, что делает функция request. Конечно, по крайней мере последняя функция должна быть действительно асинхронной, и обычно это функция, экспортируемая одним из встроенных модулей узла (fs, http, ...). Он также может быть экспортирован собственным модулем или с использованием модуля worker_threads в более поздних версиях узла.

  2. Ключевое слово async не требуется для функции, которая должна быть асинхронной,Обозначение функции как async позволяет функции использовать синтаксис await и заставляет функцию неявно возвращать Promise.

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

Обратите внимание, что я предположил среду Node.js, потому что вы использовали require, но большая часть того, что я сказал, относится и к браузеру: тамявляется цепочкой асинхронных функций, и последняя вызовет одну из встроенных функций (например, XMLHttpRequest). Среда браузера также использует цикл обработки событий, и async/await работают так же, как

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