До версии 7.6 узла обратные вызовы были единственным официальным способом, предоставляемым узлом для выполнения одной функции за другой. Поскольку архитектура узлов является однопоточной и асинхронной, сообщество разработало функции обратного вызова, которые будут запускаться (или выполняться) после завершения выполнения первой функции (которой были назначены обратные вызовы).
Пример обратного вызова:
app.get('/', function(){
function1(arg1, function(){
...
})
});
Проблема с такого рода кодом заключается в том, что такого рода ситуации могут вызвать много проблем, и код может запутаться, когда есть несколько функций. Эта ситуация называется тем, что обычно называют callback hell.
Итак, чтобы найти выход, идея Promises and function chaining.
Пример: Перед а синхронизацией/ожидание
function fun1(req, res){
return request.get('http://localhost:3000')
.catch((err) =>{
console.log('found error');
}).then((res) =>{
console.log('get request returned.');
});
Пояснение:
Приведенный выше код демонстрирует функцию, реализованную с помощью цепочки функций вместо обратных вызовов. Можно заметить, что код теперь более понятен и читаем. В коде в основном говорится, что GET localhost:3000, поймайте ошибку, если она есть; если ошибки нет, выполните следующую инструкцию:
console.log («получить возвращенный запрос».);
С узлом v8 функция async/await была официально развернута Узлом для обработки обещаний и цепочки функций. Функции не нужно связывать друг за другом, просто дождитесь функции, которая вернет Обещание. Но асинхронная функция должна быть объявлена перед ожиданием функции, возвращающей обещание. Код теперь выглядит так, как показано ниже.
Пример: После асинхронного/ожидания
async function fun1(req, res){
let response = await request.get('http://localhost:3000');
if (response.err) { console.log('error');}
else { console.log('fetched response');
}
Объяснение:
Приведенный выше код в основном запрашивает механизм javascript, выполняющий код, дождаться request.get() функция должна быть завершена, прежде чем переходить к следующей строке для ее выполнения. То request.get() функция возвращает обещание, за которое пользователь будет ожидать . Перед асинхронным/ожиданием, если необходимо убедиться, что функции выполняются в нужной последовательности, то есть одна за другой, соедините их в цепочку одну за другой или зарегистрируйте обратные вызовы.
Написание и понимание кода упрощается с помощью async/await, как видно из обоих примеров.