【问题标题】:How do I convert a promise into the array it holds?如何将 Promise 转换为它持有的数组?
【发布时间】:2021-05-28 09:51:12
【问题描述】:

我正在使用 React useReducer 并尝试显示从 firebase 获取的信息。

     async function reducer(listState, action) {
        switch (action.type) {
            case "load":
            let stateCopy2 = [...listState]; 
        let  result = await firebase.firestore().collection("contractors").doc(action.idList[0].id).get()
        console.log("non promise/ console log 1",result.data())
        return [...stateCopy2, result.data()]
        default:
            throw new Error();
        }
      }
    
      function Thing(props) {      
    
    
    return (
        <div >
              {listState.map((data, index) => (
    <div>
    {data.Bio}
    </div>
))}
    <button onClick={()=>console.log("promise/ console log 2", listState)}>check</button>
    </div>
    )
    }
    export default Thing;

当做console.log(listState); 在 console.log 1 中,信息显示了它应该显示的内容。它应该是什么:

{BIo:"hello"}

console.log 2 显示的信息是:

Promise {<fulfilled>: Array(2)}

那里显示的原始信息。

在转换之后,因为 listState 是它不能被映射的承诺。

我如何将 promise 变成数组或者不让它显示为这样?

【问题讨论】:

    标签: reactjs firebase async-await use-reducer


    【解决方案1】:

    您可以声明一个 onClick AsyncFunction:

    onClick={async () => console.log("promise/ console log 2", await listState)}
    

    或者干脆在“then”方法中做一个控制台:

    onClick={listState.then(data => console.log("promise/ console log 2", data))}
    

    【讨论】:

    • 问题出在这方面:{listState.map((data, index) => (
      {data.Bio}
      ))} 问题是因为这个“Promise {: Array(2)}" 不可迭代。所以当 listState 变成那个时,代码就会中断
    【解决方案2】:

    通过将你的 reducer 标记为 async,你正在让它返回一个 Promise。因此,您需要 await 来获取它的价值。

    我有点惊讶listState.map 调用并没有对你造成影响,但我承认我并没有仔细观察,而且从你的代码中并不清楚listState 来自你的@ 987654326@组件。

    在我看来,拥有一个异步 reducer 就像 A Bad Idea™,因为 reducer 的工作只是更新状态以响应一个动作。 stackoverflow 上的其他地方有 discussions of this 可能会有所帮助。

    【讨论】:

    • 如果不进行异步等待,似乎很难从 firebase 获取信息。那里还有一个等待,它创建了承诺。但是值是“Promise {: Array(2)}”这使得我无法再映射数组
    • 我不是说你不应该做 async/await,我是说 reducer 不适合它。显然,您的数据获取将是异步的。
    • 我同意,但是您知道如何解决我在减速器中使用它的这种情况吗?由于等待在那里,但它提出了“Promise {: Array(2)}”,它包含我想要的值数组,但不可迭代
    • 创建一个单独的异步函数来进行数据获取,并让该函数将结果分派给您的减速器合并。load().then(data =&gt; dispatch( ... ))。这样你的 reducer 就不必是异步的了。
    • 好的,我只是使用 useEffect 并希望它不会做出持有价值的承诺,而是持有价值本身。我仍然需要使用 Promise,因为 useEffect 已经获取了数据库搜索中使用的信息。
    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2017-04-04
    • 2019-05-19
    • 2021-01-25
    相关资源
    最近更新 更多