【问题标题】:How to return a object directly from async function?如何直接从异步函数返回对象?
【发布时间】:2021-03-08 12:19:17
【问题描述】:
  • 我有 Redux 存储功能,我必须在其中创建 AJAX 并相应地更新状态。但是,我创建了以下函数,它在返回状态之前不会更新 x 值。所以,我创建了async 函数。
  var x =[]
  lookup(
      "GET",
      "api/post/",
      (response, status: number) => {
        Object.assign(x, response);
      }
    );
  console.log(x,'her x stay just ampty array []');
switch (action.type) {
    case "SetData":
      return { ...state, data: x };
    default:
      return state;
  }

  • 在下面的示例中,我试图在函数 lookup 之外获取响应,因此我创建了一个名为 newData 的同步,如何让它直接重新运行 res 而不会在其中破坏 var。李>
const newData = async () => {
    var x: any = [];
    await lookup(
      "GET",
      "api/post/",
      (response: myArrays["posts"], status: number) => {
        Object.assign(x, response);
      }
    );
    return x;
  };
  console.log(newData().then((res) => res));


switch (action.type) {
    
    case "SetData":
      return { ...state, data: newData().then((res) => {return res}) };
    default:
      return state;
  }

  • 请注意:我不能在我的 store 函数中使用 React.usesState(),因为它不是一个组件函数。

【问题讨论】:

  • 听起来您需要更多地熟悉 javascript(或一般而言)中的异步编程。 google.com/search?q=understanding+promises 为您提供开始 trom 的结果分配。促使我做出此回应的是您在 console.log 函数中的使用。在 Promise(异步函数返回的内容)上调用 then 并不会神奇地将其转换为同步“值”,您可以使用 Promise 的“Then”函数来转换其数据或在数据准备好时执行操作,但是Then 函数只返回一个新的承诺。我们都去过你现在的位置。

标签: javascript reactjs redux


【解决方案1】:

按照您尝试执行此操作的方式是不可能执行此操作的。你需要做的是这样的:

const data = await newData();
dispatch({ type: "SetData", data })

【讨论】:

    【解决方案2】:

    Redux reducer 不能是异步的。 reducer 获取先前的状态和动作并将其映射到新动作。就是这样。您不能从 reducer 分派操作或触发 API 调用。

    API 调用需要在其他地方进行——在您的组件中,在redux-thunk 操作创建者中,等等。一旦 API 调用完成,您就可以使用您收到的数据发送一个“SetData”操作。然后reducer 会根据这些数据更新state

    【讨论】:

      【解决方案3】:

      以下应该有效:

      const newData = async () => {
          return await lookup(
            "GET",
            "api/post/",
            (response: myArrays["posts"], status: number) => {
              Object.assign(x, response);
            }
          );
      };
      
      console.log(await newData());
      

      这样您就可以避免按照您的要求在newData 内分配另一个var

      还可以查看redux tutorial,了解如何使用 redux 进行异步数据获取。

      【讨论】:

      • 'await' expressions are only allowed within async functions and at the top levels of modules.ts(1308)
      • 尝试按照消息中的说明将async 添加到包装函数中。
      • 你不能像async console.log(await newData());那样做
      猜你喜欢
      • 2020-06-28
      • 2019-12-25
      • 2020-07-29
      • 2023-03-08
      • 1970-01-01
      • 2021-05-20
      • 2021-03-04
      • 2021-12-03
      • 1970-01-01
      相关资源
      最近更新 更多