React Promise 不会 return 一个值
React Promise will not return a value
在尝试解决我的承诺时,我收到错误消息“对象作为 React 子对象无效(找到:[object Promise]”)。
在 GetCardsFromBoard() 中的 API 请求之后的 console.log 中,typeOf() 我的响应是字符串,它将数据打印到控制台。但是在 TrelloTester() 中,控制台显示我的响应仍然是 Promise<pending>
并且我得到了错误。
我尝试了很多配置,但我无法得到解决的承诺,感谢您的帮助!
const fetch = require('node-fetch');
export async function GetCardsFromBoard(board) {
let cards = await fetch(
baseURL+'boards/'+board+'/cards?key='+key+'&token='+token,
{
method: 'GET',
headers: {
'Accept': 'application/json'
}
})
.then(response => {return response.text()})
.catch(err => console.error(err));
console.log(typeof(cards), cards); //prints "string" type and then the entire json response
return cards;
}
export function TrelloTester() {
let bodyStr = GetCardsFromBoard(boardID);
console.log("resp: ", bodyStr); //shows Promise<pending>, but with the correct response value inside
return (
<BigCard header=" " body={bodyStr}/>
);
}
export default TrelloTester;
http响应需要转换为json,使用json()方法。
let cards = await fetch(
baseURL+'boards/'+board+'/cards?key='+key+'&token='+token,
{
method: 'GET',
headers: {
'Accept': 'application/json'
}
})
.then(response => {return response.json()})
.catch(err => console.error(err));
GetCardsFromBoard returns 一个承诺。 async/await 只是承诺之上的糖分,实际上并没有使代码的异步性降低。因此,您的 TrelloTester 组件仍然必须将该函数视为 Promise。
请注意,我删除了您承诺中的 then
;如果你使用 async/await 那么你可以 await
所有的承诺!
export async function GetCardsFromBoard(board) {
try {
const cards = await fetch(
baseURL+'boards/'+board+'/cards?key='+key+'&token='+token,
{
method: 'GET',
headers: {
'Accept': 'application/json'
}
})
return await cards.text();
} catch(e) {
console.log(e);
}
}
在您的组件中,由于这是异步的,我建议将其视为一种效果,并结合使用 useEffect
挂钩和 useState
挂钩。
import React, { useEffect, useState } from "react";
export function TrelloTester() {
const [bodyStr, setBodyStr] = useState("");
useEffect(() => {
cont getCards = async () => {
const cards = await GetCardsFromBoard(boardID);
setBodyStr(cards);
}
getCards();
}, []);
return bodyStr ? (
<BigCard header=" " body={bodyStr}/>
) : "Loading...";
}
export default TrelloTester;
在尝试解决我的承诺时,我收到错误消息“对象作为 React 子对象无效(找到:[object Promise]”)。
在 GetCardsFromBoard() 中的 API 请求之后的 console.log 中,typeOf() 我的响应是字符串,它将数据打印到控制台。但是在 TrelloTester() 中,控制台显示我的响应仍然是 Promise<pending>
并且我得到了错误。
我尝试了很多配置,但我无法得到解决的承诺,感谢您的帮助!
const fetch = require('node-fetch');
export async function GetCardsFromBoard(board) {
let cards = await fetch(
baseURL+'boards/'+board+'/cards?key='+key+'&token='+token,
{
method: 'GET',
headers: {
'Accept': 'application/json'
}
})
.then(response => {return response.text()})
.catch(err => console.error(err));
console.log(typeof(cards), cards); //prints "string" type and then the entire json response
return cards;
}
export function TrelloTester() {
let bodyStr = GetCardsFromBoard(boardID);
console.log("resp: ", bodyStr); //shows Promise<pending>, but with the correct response value inside
return (
<BigCard header=" " body={bodyStr}/>
);
}
export default TrelloTester;
http响应需要转换为json,使用json()方法。
let cards = await fetch(
baseURL+'boards/'+board+'/cards?key='+key+'&token='+token,
{
method: 'GET',
headers: {
'Accept': 'application/json'
}
})
.then(response => {return response.json()})
.catch(err => console.error(err));
GetCardsFromBoard returns 一个承诺。 async/await 只是承诺之上的糖分,实际上并没有使代码的异步性降低。因此,您的 TrelloTester 组件仍然必须将该函数视为 Promise。
请注意,我删除了您承诺中的 then
;如果你使用 async/await 那么你可以 await
所有的承诺!
export async function GetCardsFromBoard(board) {
try {
const cards = await fetch(
baseURL+'boards/'+board+'/cards?key='+key+'&token='+token,
{
method: 'GET',
headers: {
'Accept': 'application/json'
}
})
return await cards.text();
} catch(e) {
console.log(e);
}
}
在您的组件中,由于这是异步的,我建议将其视为一种效果,并结合使用 useEffect
挂钩和 useState
挂钩。
import React, { useEffect, useState } from "react";
export function TrelloTester() {
const [bodyStr, setBodyStr] = useState("");
useEffect(() => {
cont getCards = async () => {
const cards = await GetCardsFromBoard(boardID);
setBodyStr(cards);
}
getCards();
}, []);
return bodyStr ? (
<BigCard header=" " body={bodyStr}/>
) : "Loading...";
}
export default TrelloTester;