javascript - 如何在反应中从履行的承诺中获得价值
问题描述
我有一个 API 可以在反应项目中返回我的预期结果。
我写了这个函数来调用 API 并得到结果:
async function getUsers() {
const token = store.getState().token;
const data = { token };
await MyApi.getUsers(data)
.then((result) => {
console.log(result);
return result;
})
.catch((error) => {
console.log(error);
return null;
});
}
const userList = getUsers();
当我在函数result
的then
部分 console.log 时,它打印了预期的用户列表(即一个 json 数组)。但是当我 console.log 时,userList
它promise
就像下面的图像:
这意味着getUsers
函数的返回值是 a Promise
。
1- 我怎样才能从这个承诺中得到结果?
2-为什么in部分PromiseResult
是json 数组?undefined
result
then
** 这些代码不在反应组件中
预期result
是:
[
{
id: 1,
name: "user1",
role: "student"
},
{
id: 2,
name: "user2",
role: "student"
},
{
id: 3,
name: "user3",
role: "student"
},
]
我想使用userList
数组来创建user card
:
<div>
{userList ? (
userList.map((user) =>
{
<Card>
<h1> user.name </h1>
</Card>
}
):
(<h1>user list is empty </h1>)
}
解决方案
问题
为什么 PromiseResult 未定义,而 then 部分中的结果是 json 数组?
getUsers
是一个async
函数,因此它隐式返回 aPromise
但您不返回任何已解析的值,它只是等待MyApi.getUsers
解决的承诺并且不返回任何内容,即返回 void 或未定义。
换句话说,从逻辑上讲,它看起来像下面这样:
async function getUsers() {
const token = store.getState().token;
const data = { token };
await MyApi.getUsers(data)
.then((result) => {
console.log(result);
return result;
})
.catch((error) => {
console.log(error);
return null;
});
return undefined;
}
解决方案
回报MyApi.getUsers
承诺。
async function getUsers() {
const token = store.getState().token;
const data = { token };
return MyApi.getUsers(data)
.then((result) => {
console.log(result);
return result;
})
.catch((error) => {
console.log(error);
return null;
});
}
现在在你的反应代码中,你可能会有一些useEffect
钩子调用这个函数来设置一些加载状态。
const [userList, setUserList] = useState([]);
useEffect(() => {
getusers()
.then(userList => setUserList(userList))
.catch(error => {
// handle any error state, rejected promises, etc..
});
}, []);
或者
const [userList, setUserList] = useState([]);
useEffect(() => {
const loadUserList = async () => {
try {
const userList = await getusers();
setUserList(userList)
} catch(error) {
// handle any error state, rejected promises, etc..
}
};
loadUserList();
}, []);
推荐阅读
- php - 如何从 laravel forge 中删除表?(无法 delpoy 服务器)
- javascript - How to avoid blank initialization with taggingjs
- javascript - Datatable with several input options
- excel - 需要在一个范围内的活动单元格中将值 1 增加 1
- flask - How do I use .json file/data, to display node graph in browser using Sigma js and Flask?
- python - 从 SymPy 表达式中提取数字
- c++ - 使用递归输出数组
- c# - Add dependency after deserializing objects
- mysql - Is there a way to have a table with values that references the columns themselves of another table?
- django - Username turns into link to user profile Django