Когда я вызываю rest API и возвращаю ответ, он показывает неопределенный, но я console.log этот ответ возвращает
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.log('', 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.log('', result)
})
}
console.log('', main())
Я хочу, когда я вызываю rest API и возвращаю ответ, он показывает правильный вывод
5 ответов
Возвращение внутри области then
не возвращается для функции main
, а только для then
области обещания. Вам нужно вернуть обещание так:
function main() {
var initializePromise = initialize();
return initializePromise.then(function (result) {
return result;
})
}
main().then((result) => console.log('',result));
Вы не можете заставить функцию синхронизации вызывать асинхронный метод и ожидать получить его результат.
Затем разрешение метода initializePromise разрешается на более поздней стадии, когда ответ извлекается из HTTP-вызова REST, т. Е. Он не возвращается при вызове метода main () из-за того, что он асинхронный. Чтобы обработать такой код, вы должны либо использовать обратный вызов
function main(completionHandler) {
var initializePromise = initialize();
initializePromise.then(function (result) {
completionHandler(result);
})
}
main((result) => { console.log(result)})
Или обещание
function main() {
// Return new promise
return new Promise(resolve => {
var initializePromise = initialize();
initializePromise.then(function (result) {
resolve(result);
})
}
}
main().then(result => console.log(result));
Использовать async/await
async function main() {
var initializePromise = await initialize();
console.log(initializePromise)
}
Мой вопрос: почему вы добавляете в новое обещание что-то уже возвращаемое?
Вы могли бы просто сделать:
request.get(endpoint, options).then((response) => console.log(response)).catch((error) => console.log(error));
Дайте мне знать, что выход в этом случае.
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.log(result);
return result;
}).catch((err) => {
console.log(err);
return err;
})
}
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.