我在异步和等待方面遇到问题,这里我试图从天气API中获取天气,但是在我的主要功能getWeather中,我希望代码在继续操作之前先等待http.get完成。您可以想象,目前,控制台上的输出首先是“测试”,然后是“伦敦的温度是...”。我尝试了很多使用promise和async / await的不同方法,但是它们都不起作用... 有人知道如何首先打印天气,然后“测试”吗?谢谢
var http = require('http');
function printMessage(city, temperature, conditions){
var outputMessage = "In "+ city.split(',')[0] +", temperature is
"+temperature+"°C with "+conditions;
console.log(outputMessage);
}
function printError(error){
console.error(error.message);
}
function getWeather(city){
var request = http.get("http://api.openweathermap.org/data/2.5/weather?q="+ city +"&APPID=[API_ID]&units=metric", function(response){
var body = "";
response.on('data', function(chunk){
body += chunk;
});
response.on('end', function(){
if (response.statusCode === 200){
try{
var data_weather = JSON.parse(body);
printMessage(city, data_weather.main.temp, data_weather.weather[0].description);
} catch(error) {
console.error(error.message);
}
} else {
printError({message: "ERROR status != 200"});
}
});
});
console.log('test');
}
getWeather("London");
答案 0 :(得分:0)
尝试一下:
getWeather = function(city){
return new Promise(async function(resolve, reject){
try{
var dataUrl = await http.get("http://api.openweathermap.org/data/2.5/weather?q="+ city +"&APPID=[API_ID]&units=metric";
resolve(dataUrl);
} catch(error) {
return reject(error);
}
})
};
答案 1 :(得分:0)
将request
包装在一个诺言中:
function requestAsync() {
return new Promise((resolver, reject) => {
// request
http.get("http://api.openweathermap.org/data/2.5/weather?q=" + city + "&APPID=[API_ID]&units=metric", function (response) {
var body = "";
response.on('data', function (chunk) {
body += chunk;
});
response.on('end', function () {
if (response.statusCode === 200) {
try {
var data_weather = JSON.parse(body);
printMessage(city, data_weather.main.temp, data_weather.weather[0].description);
// request will done here!
resolver();
return;
} catch (error) {
console.error(error.message);
}
} else {
printError({ message: "ERROR status != 200" });
}
// request was failed!
reject();
});
});
})
}
并使用async / await呼叫requestAsync
:
async function getWeather(city) {
await requestAsync();
console.log('test');
}
getWeather("London");