Когда я вызываю rest API и возвращаю ответ, он показывает undefined, но я console.info, этот ответ он возвращает
var request = require("request");
function initialize() {
// Setting URL and headers for request
var options = {
url: 'http://postalpincode.in/api/pincode/400605',
json: true
};
// Return new promise
return new Promise(function (resolve, reject) {
// Do async job
request.get(options, function (err, resp, body) {
if (err) {
reject(err);
} else {
resolve(JSON.stringify(body));
}
})
})
}
function main() {
var initializePromise = initialize();
initializePromise.then(function (result) {
return result;
})
}
console.info('', main())
Но когда я консольно регистрирую этот ответ, он показывает правильный вывод
var request = require("request");
function initialize() {
// Setting URL and headers for request
var options = {
url: 'http://postalpincode.in/api/pincode/400605',
json: true
};
// Return new promise
return new Promise(function (resolve, reject) {
// Do async job
request.get(options, function (err, resp, body) {
if (err) {
reject(err);
} else {
resolve(JSON.stringify(body));
}
})
})
}
function main() {
var initializePromise = initialize();
initializePromise.then(function (result) {
console.info('', result)
})
}
console.info('', main())
Я хочу, когда я вызываю rest API и возвращаю ответ, он показывает правильный вывод



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Мой вопрос: почему вы заключаете в новый промис то, что уже относится к возвращаемому типу промиса?
Вы можете просто сделать:
request.get(endpoint, options).then((response) => console.info(response)).catch((error) => console.info(error));
Дайте мне знать, что выход в этом случае.
использовать async/await
async function main() {
var initializePromise = await initialize();
console.info(initializePromise)
}
При использовании асинхронного/ждите его возврата Promise { <pending> } {"Message":"Number of Post office(s) found: 1","Status":"Success","PostOffice":[{"Name":"Kalwa","Description":"","BranchType":"Sub Post Office","DeliveryStatus":"Delivery","Taluk":"Thane","Circle":"Thane","District":"Thane","Division":"Thane Central","Region":"Mumbai","State":"Maharashtra","Country":"India"}]}
распечатайте результат с помощью initializePromise.PostOffice и посмотрите, что будет напечатано.
И что ? Я думаю, что это верный ответ!
async/await — это просто еще один инструмент для обработки асинхронного поведения. Тем не менее, op нуждается в лучшем понимании того, как работают промисы и асинхронность.
При использовании результата initializePromise.PostOffice он будет печатать undefined
Возврат внутри thenscope возвращается не для функции main, а только для thenscope промиса. Вам нужно вернуть обещание так:
function main() {
var initializePromise = initialize();
return initializePromise.then(function (result) {
return result;
})
}
main().then((result) => console.info('',result));
вы не можете заставить функцию синхронизации вызывать асинхронный метод и ожидать получения результата.
Затем разрешение метода initializePromise разрешается на более позднем этапе, когда ответ извлекается из HTTP-вызова REST, т. е. он не возвращается при вызове метода main() из-за того, что он асинхронный. Чтобы обработать такой код, вы должны либо использовать обратный вызов
function main(completionHandler) {
var initializePromise = initialize();
initializePromise.then(function (result) {
completionHandler(result);
})
}
main((result) => { console.info(result)})
или обещание
function main() {
// Return new promise
return new Promise(resolve => {
var initializePromise = initialize();
initializePromise.then(function (result) {
resolve(result);
})
}
}
main().then(result => console.info(result));
В этом случае он войдет в `Promise {<pending>}`, а затем через 1 с напечатает console.info.
return new Promise(function (resolve, reject) {
// Do async job
request.get(options, function (err, resp, body) {
if (err) {
reject(err);
} else {
try {
resolve(JSON.stringify(body));
} catch(e) {
reject(e);
}
}
})
})
в основной функции:
function main() {
initialize().then((result) => {
console.info(result);
return result;
}).catch((err) => {
console.info(err);
return err;
})
}
Используйте обратный вызов в main или создайте обещание в main или используйте асинхронность и ожидание. Это асинхронная функция.