javascript - 我的函数正在返回 [对象承诺]
问题描述
我正在尝试获取星球大战角色及其家乡的列表。homeworld 是一个链接,所以它需要另一个 fetch 来获取名称,但在控制台中它返回 [Object promise]。我认为问题在于尝试获得实际的行星名称需要太长时间。但是我该如何解决这个问题?
const processStarWars = function (jsonObject) {
let arrStarWarsPeople = jsonObject.results;
for (const personage of arrStarWarsPeople){
const name = personage.name;
const birthYear = personage.birth_year;
const planet = fetch(personage.homeworld)
.then(function (response) {
//antwoord van functie fetch bekijken
if (!response.ok){
throw error(`Er lijkt een fout te gebeuren, status code ${response.status}`);
}else{
console.log("object goed gevonden");
return response.json();
}
}).then(function(jsonObject){
//alles is ok dus, we kunnen het object verwerken en doorgeven
console.log(jsonObject.name);
return jsonObject.name;
}).catch(function (error) {
//opvangen van een eventuele fout
console.log(`Er was een fout bij het verwerken van de JSON, fout:${error}`);
});
console.log(`${name} - ${birthYear} - ${planet}`)
}
};
const loadStarWarsInfo = function() {
fetch("https://swapi.co/api/people/")
.then(function (response) {
if (!response.ok){
throw error(`Er lijkt een fout te gebeuren, status code ${response.status}`);
}else{
console.log("object goed gevonden");
return response.json();
}
}).then(function(jsonObject){
console.log("alles oke we kunnen verder");
processStarWars(jsonObject);
}).catch(function (error) {
console.log(`Er was een fout bij het verwerken van de JSON, fout:${error}`);
})
};
document.addEventListener('DOMContentLoaded', function() {
loadStarWarsInfo();
});
解决方案
您可以通过等待 fetch 完成await fetch(personage.homeworld)
并需要执行该processStarWars
功能来解决此问题async
。
演示:
const processStarWars = async function (jsonObject) {
let arrStarWarsPeople = jsonObject.results;
for (const personage of arrStarWarsPeople){
const name = personage.name;
const birthYear = personage.birth_year;
const planet = await fetch(personage.homeworld)
.then(function (response) {
//antwoord van functie fetch bekijken
if (!response.ok){
throw error(`Er lijkt een fout te gebeuren, status code ${response.status}`);
}else{
console.log("object goed gevonden");
return response.json();
}
}).then(function(jsonObject){
//alles is ok dus, we kunnen het object verwerken en doorgeven
console.log(jsonObject.name);
return jsonObject.name;
}).catch(function (error) {
//opvangen van een eventuele fout
console.log(`Er was een fout bij het verwerken van de JSON, fout:${error}`);
});
console.log(`${name} - ${birthYear} - ${planet}`)
}
};
const loadStarWarsInfo = function() {
fetch("https://swapi.co/api/people/")
.then(function (response) {
if (!response.ok){
throw error(`Er lijkt een fout te gebeuren, status code ${response.status}`);
}else{
console.log("object goed gevonden");
return response.json();
}
}).then(function(jsonObject){
console.log("alles oke we kunnen verder");
processStarWars(jsonObject);
}).catch(function (error) {
console.log(`Er was een fout bij het verwerken van de JSON, fout:${error}`);
})
};
document.addEventListener('DOMContentLoaded', function() {
loadStarWarsInfo();
});
推荐阅读
- excel - 使用 matlab activex 服务器选择多个范围
- javascript - 无法在 JavaScript 中打印出正则表达式的匹配项
- ios - 如何保存应用于 UIView 的 CATransform3D
- spring-boot - 当我将 setHttpOnly 和 setSecure 设置为 true 时,Cookie 为空
- java - 将变量从一个 POJO 复制到另一个
- laravel - 如何在 Laravel 验证中使用其他字段值
- javascript - 对输入字段的任何更改调用 jQuery 函数
- c# - 显示时大双打变成负数的问题
- python - 在 Python 中为 Oracle 选择查询绑定变量
- typescript - TypeError:在 ionic 3 中使用指纹插件时,Object(...) 不是函数