Вы можете думать о обратном вызове как о функции, которая вызывается, когда что-то завершено (вообще говоря).В вашем примере обратным вызовом является эта функция:
function (e, r,
body)
{
console.log(body)
}
Таким образом, вам необходимо вернуться внутрь этого обратного вызова, потому что именно тогда вы получите ответ на запрос, который вы делаете.В вашем примере вы возвращаете ответ до того, как на самом деле есть ответ для возврата, потому что код продолжит выполняться и выполнит оператор return, даже если вы еще не получили ответ.Кроме того, переменная response
не существует.
Приведенное выше решение Амира - это чистый и хороший способ сделать это.Is использует синтаксис async / await, который является довольно новым и основан на Promises.Я бы порекомендовал вам взглянуть на обе эти концепции, но обратные вызовы все еще очень распространены в JS (возможно, наиболее распространенных), поэтому их понимание важно.
Если вы хотите использовать обратные вызовы в вашем примере, попробуйте следующее:
var request = require('request');
function A(callback) {
var url = "---";
var headers = { 'data': '---' };
var resp = request.get({ url: url, headers:headers }, function (e, r,
body)
{
console.log(body)
callback(r); // Here, we send the response to the callback function
});
}
function B() {
A(function(data) { // this is the callback function sent to A()
console.log("recived data");
console.log(data);
});
}
B();
(сейчас я не могу сам протестировать этот код, поэтому могут быть некоторые опечатки.)
Редактировать: если вы хотите использовать данные, полученные в функции BВы можете передать ему обратный вызов, например, так:
function B(callback) {
A(function(data) { // this is the callback function sent to A()
console.log("recived data");
console.log(data);
callback(data);
});
}
Чтобы использовать данные из функции B:
B(function(data) {
// do something with the data here
});