javascript - 使用小胡子渲染 [object Promise] 将来自 Axios 承诺的数据渲染成 HTML
问题描述
我正在尝试从呈现为 HTML 的 API 获取数据。我通过以下方式向 API 发出请求:
const openWeatherMapApiUrl = "https://cors-anywhere.herokuapp.com/http://api.openweathermap.org/data/2.5/weather";
async function getWeatherData() {
try {
const response = await axios.get(openWeatherMapApiUrl, {
params: {
q: "London,uk",
appId: "956d289b64e4e226bdef9ce1f93b475b"
}
})
console.log(response.data);
return response.data;
} catch (error) {
console.error(error);
}
}
从那里,我将该数据呈现到我的 HTML 中:
renderWeather = () => {
var template = document.getElementById('template').innerHTML;
var rendered = Mustache.render(template, {
cityName: getWeatherData()
});
document.getElementById('target').innerHTML = rendered;
}
它不是渲染数据,而是渲染[object Promise]
. 我知道这可能是由于承诺尚未兑现,因此我也尝试通过以下方式兑现:
getWeatherData().then((response) => {return response})
以及它在不同地方的不同变体,但这仍然返回相同的[object Promise]
响应。
解决方案
getWeatherData
返回一个需要await
-ed 以获取数据的承诺,如果在内部报告错误,则getWeatherData
重新抛出错误以通知调用者:
const openWeatherMapApiUrl = "https://cors-anywhere.herokuapp.com/http://api.openweathermap.org/data/2.5/weather";
async function getWeatherData() {
try {
const response = await axios.get(openWeatherMapApiUrl, {
params: {
q: "London,uk",
appId: "956d289b64e4e226bdef9ce1f93b475b"
}
})
console.log(response.data);
return response.data;
} catch (error) {
console.error(error);
throw error; // reject returned promise
}
}
如果调用函数后要报错,可以简化为
function getWeatherData() {
return axios.get(openWeatherMapApiUrl, {
params: {
q: "London,uk",
appId: "956d289b64e4e226bdef9ce1f93b475b"
}
})
}
}
await
在 Promise 链中调用或处理时,这两个版本都需要-ed
getWeatherData()
.then( data => console.log(data))
.catch( err => console.error(err));
提供数据作为参数renderWeather
有助于从异步代码中调用它:
renderWeather = (weatherData) => {
var template = document.getElementById('template').innerHTML;
var rendered = Mustache.render(template, {
cityName: weatherData
});
document.getElementById('target').innerHTML = rendered;
}
推荐阅读
- javascript - 使用 Cloudflare Worker 重定向多个 URL
- android - Android CameraX如何旋转输出视频
- css - 列表在移动视图中显示为垂直但在桌面视图中显示为水平?
- druid - DRUID SQL LATEST() 和 EARLIEST() 返回零
- flutter - Flutter moor:缺少 libsqlite3.so
- javascript - 通过 Nginx 反向代理使用 Nodejs 保护 Websockets - 错误 301
- unix - 使用 Sed 中的变量替换文本不起作用
- c# - “无法将字符转换为字符串”CS0030
- c++ - 什么时候应该内联函数?
- sql - DATEDIFF 日期与 EXISTS/IN 另一个日期表