React Promise 不会返回值

Posted

技术标签:

【中文标题】React Promise 不会返回值【英文标题】:React Promise will not return a value 【发布时间】:2021-04-03 07:26:00 【问题描述】:

在尝试解决我的承诺时,我收到错误消息“对象作为 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;

【问题讨论】:

GetCardsFromBoard 返回一个 Promise。 async/await 只是 Promise 之上的糖,实际上并没有使代码的异步性降低。因此,您的 TrelloTester 组件仍然必须将该函数视为 Promise。 【参考方案1】:

GetCardsFromBoard 返回一个 Promise。 async/await 只是 Promise 之上的糖,实际上并没有使代码的异步性降低。因此,您的 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;

【讨论】:

【参考方案2】:

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));

【讨论】:

以上是关于React Promise 不会返回值的主要内容,如果未能解决你的问题,请参考以下文章

Promise.then方法的返回值问题

关于获取Promise返回值的问题!

React中插值表达式里面的函数返回值无效?

为啥,如果 `$q.all` 没有返回一个 promise 数组,那么不会抛出异常?

从 Promise 返回一个值

Promise 中的返回值