Что такое ад обратных вызовов в Node.js?

Опубликовано: 1 Августа, 2021

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

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

Что такое асинхронный Javascript?

  • Некоторым функциям в Javascript требуется AJAX, потому что некоторые функции откликаются не сразу. Это занимает некоторое время, и следующая операция не может начаться немедленно. Он должен дождаться завершения функции в фоновом режиме. В таких случаях обратные вызовы должны быть асинхронными.
  • Есть несколько внешних веб-API Javascript, которые позволяют использовать AJAX - асинхронный Javascript и XML.
    В AJAX можно одновременно выполнять множество операций.

Что такое обратный звонок?

  • Обратные вызовы - это не что иное, как функции, которым требуется время для получения результата.
  • Обычно эти асинхронные обратные вызовы (async, сокращение от asynchronous) используются для доступа к значениям из баз данных, загрузки изображений, чтения файлов и т. Д.
  • Поскольку для их завершения требуется время, мы не можем перейти к следующей строке, потому что это может вызвать ошибку, говорящую о недоступности, и мы не можем приостановить нашу программу.
  • Поэтому нам нужно сохранить результат и перезвонить, когда он будет завершен.

Что такое ад обратного вызова?
Это большая проблема, вызванная кодированием со сложными вложенными обратными вызовами. Здесь каждый обратный вызов принимает аргумент, который является результатом предыдущих обратных вызовов. Таким образом, структура кода выглядит как пирамида, что затрудняет чтение и сопровождение. Кроме того, если есть ошибка в одной функции, это повлияет на все остальные функции.

Пример: это пример типичного ада обратного вызова.




app.get( "/details" , function (req, res) {
var name = req.query.name;
console.log(name);
Scopus.find({ name: name },
{ '_id' : 0, 'authorId' : 1 },
function (err, result) {
if (err) { }
else {
var searchResult = result[0][ "authorId" ];
console.log(searchResult);
var options = {
+ searchResult + "?apiKey" ,
headers: { 'Accept' : 'application/json' }
};
request(options, function (error, response, body) {
if (error) {
// Print the error if one occurred
console.error( 'error in Authors :' , error);
// Print the response status code if a response was received
console.log( 'statusCode:' , response && response.statusCode);
res.send( "error" )
}
else if (!error) {
var jsonObj = JSON.parse(body);
if (jsonObj[ 'author-retrieval-response' ] == undefined) {
res.send( "No details" );
}
else {
var reqData = jsonObj[ 'author-retrieval-response' ][0];
var authprofile = reqData[ "author-profile" ]
var names = authprofile[ "preferred-name" ][ "indexed-name" ]
console.log(names);
var citation = reqData[ "coredata" ][ "citation-count" ];
var query = { authorId: searchResult };
Scopus.findOneAndUpdate(query, {
name: names,
citationCount: citation
}, function (err, doc, res) {
if (err) {
console.log( "error" );
}
else {
console.log( "success" );
}
})
res.render( "details" , { data: reqData });
}
}
});
}
})
});

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

Как выбраться из ада обратных вызовов?

  • JavaScript предоставляет простой способ избежать ада обратных вызовов. Это делается с помощью очереди событий и обещаний.
  • Обещание - это объект, возвращаемый любой асинхронной функцией, к которому могут быть добавлены методы обратного вызова на основе результата предыдущей функции.
  • Обещания используют метод .then () для вызова асинхронных обратных вызовов. Мы можем связать столько обратных вызовов, сколько захотим, и порядок также строго поддерживается.
  • Обещания используют метод .fetch () для извлечения объекта из сети. Он также использует метод .catch () для перехвата любого исключения, когда какой-либо блок выходит из строя.
  • Таким образом, эти обещания помещаются в очередь событий, чтобы они не блокировали последующий код JS. Кроме того, как только результаты будут возвращены, очередь событий завершает свою работу.
  • Есть также другие полезные ключевые слова и методы, такие как async, wait, settimeout (), чтобы упростить и лучше использовать обратные вызовы.