React – Async / Await 似乎没有等待

乔尔摩根

我之前在“无法读取未定义的属性'数据'”的错误消息下发布了此问题。但是在深入研究几个小时的过程中,我发现我的问题实际上归结为我的“async/await”似乎不是。. . . 等待!是的,我确实检查了这里已经问过的这个问题的其他几个版本。:)

我正在构建一个 React 表单,其中有几个下拉框填充了来自 MongoDB 的数据。我对 React 比较陌生,也是 MongoDB 的初学者。

通过将所有代码塞入一个文件中,我已经能够成功地将数据放入下拉列表中。现在,我正在尝试通过将片段正确拆分为单独的文件来开始重构代码。这就是我遇到“数据延迟”问题的地方。

当“componentDidMount”调用“fetchProjects”函数时,该函数会使用“projects service”文件中的“getProjects”函数从MongoDB获取项目列表。当“fetchProjects”中的console.log 运行时,它返回未定义。但是在数据集返回为未定义(并在过程中出错)之后,我确实从“getProjects”函数中获得了项目对象数组的控制台日志。

我已经能够在“getProjects”函数中使用硬编码的对象数组数据来处理这个过程,所以这告诉我问题在于从 MongoDB 实际获取数据所需的时间量。

请告诉我有一种方法可以在不使用 Redux 的情况下解决这个问题!:D

这是我的 App.js 文件 –

import React, { Component } from "react";
import "./App.css";
import { getProjects } from "./services/svcProjects";

class App extends Component {
  state = {
    data: {
      selProject: ""
    },
    projects: []
  };

  async componentDidMount() {
    await this.fetchProjects();
  }

  async fetchProjects() {
    const { data: projects } = await getProjects();
    console.log(projects);
    this.setState({ projects });
  }

  render() {
    return (
      <div className="App">
        <h1>Project Log</h1>
        <label htmlFor={"selProject"}>{"Project"}</label>
        <select name={"selProject"} id={"selProject"} className="form-control">
          <option value="" />
          {this.state.projects.map(a => (
            <option key={a._id} value={a.project}>
              {a.project}
            </option>
          ))}
        </select>
      </div>
    );
  }
}

export default App;

这是“项目服务”文件。同样,请注意这里的 console.log 语句表明我仍在从 MongoDB 获取数据。该数据需要很长时间才能返回 App.js 文件。

另外,顺便说一下,我意识到在这个文件中包含我的 Mongo 连接信息是一个巨大的安全漏洞。我稍后会解决这个问题。

import {
  Stitch,
  RemoteMongoClient,
  AnonymousCredential
} from "mongodb-stitch-browser-sdk";

export function getProjects() {
  const client = Stitch.initializeDefaultAppClient("------");
  const db = client
    .getServiceClient(RemoteMongoClient.factory, "-----")
    .db("----------");
  client.auth
    .loginWithCredential(new AnonymousCredential())
    .then(() =>
      db
        .collection("--------")
        .find({}, { sort: { Project: 1 } })
        .asArray()
    )
    .then(res => {
      console.log("Found docs", res);
      console.log("[MongoDB Stitch] Connected to Stitch");
      return res;
    })
    .catch(err => {
      console.error(err);
    });
}
tbuglc

我认为在您的getProjects()服务中添加退货将解决您的问题。

import {
  Stitch,
  RemoteMongoClient,
  AnonymousCredential
} from "mongodb-stitch-browser-sdk";

export function getProjects() { //add async if you need to await in func body
  const client = Stitch.initializeDefaultAppClient("------");
  const db = client
    .getServiceClient(RemoteMongoClient.factory, "-----")
    .db("----------"); // if these above are async, then await them as well.

    // added return keyword here
    return client.auth // should return Promise to await in your component
    .loginWithCredential(new AnonymousCredential())
    .then(() =>
      db
        .collection("--------")
        .find({}, { sort: { Project: 1 } })
        .asArray()
    )
    .then(res => {
      console.log("Found docs", res);
      console.log("[MongoDB Stitch] Connected to Stitch");
      return res;
    })
    .catch(err => {
      console.error(err);
    });
}

编辑1:

对于重构,我认为将 redux 和 redux-saga 结合起来会给你很好的关注点分离和一种轻松编写测试的方法,如果你打算这样做的话。但总的来说,我认为上面的这个调整至少可以解决你的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Angular 5 async-await 没有按预期等待

来自分类Dev

对 React 的这个 axios async/await 请求有什么问题?

来自分类Dev

Async Await 等待所有结果并继续

来自分类Dev

为什么 Java 没有 async/await?

来自分类Dev

等待动作在Nuxt.js中以Async / Await完成(SPA,没有SSR)

来自分类Dev

React 中的 Axios Async-Await

来自分类Dev

如何使用await / async等待资源

来自分类Dev

问题 RE 在箭头函数上使用带有 Async/Await 的 React 类字段

来自分类Dev

JS:Async/await 似乎不会在循环中等待结果

来自分类Dev

没有正确理解 async/await/promises 是如何工作的

来自分类Dev

在React Native中使用async / await时出错

来自分类Dev

在React JS中可以使用async / await吗?

来自分类Dev

在 ES8 的 async/await 中包装 React 的 setState 函数

来自分类Dev

WPF如何处理等待Async / Await响应的字段?

来自分类Dev

WPF如何处理等待Async / Await响应的字段?

来自分类Dev

如何使代码在以下 async/await 函数中等待?

来自分类Dev

JS async await 不等待也不阻塞进程

来自分类Dev

如何使用 async/await 进行错误处理而不必等待

来自分类Dev

NodeJS Async/Await 不等待(返回 Promise 挂起)

来自分类Dev

Async/await 在继续之前不会等待数据库查询

来自分类Dev

httpclient async / await是否

来自分类Dev

ReaderWriterLockSlim和async \ await

来自分类Dev

EvaulateScriptAsPromiseAsync和async / await

来自分类Dev

正确使用Async / Await

来自分类Dev

Mongodb async await with express

来自分类Dev

带有 TaskCompletionSource 和 async/await 的 UDP 协议

来自分类Dev

我的代码中的 async/await 有什么问题吗

来自分类Dev

Redux Action Creator 有什么更好的方法:.then 或 async/await 语法?

来自分类Dev

Async / Await - 带有对象映射功能的承诺

Related 相关文章

  1. 1

    Angular 5 async-await 没有按预期等待

  2. 2

    对 React 的这个 axios async/await 请求有什么问题?

  3. 3

    Async Await 等待所有结果并继续

  4. 4

    为什么 Java 没有 async/await?

  5. 5

    等待动作在Nuxt.js中以Async / Await完成(SPA,没有SSR)

  6. 6

    React 中的 Axios Async-Await

  7. 7

    如何使用await / async等待资源

  8. 8

    问题 RE 在箭头函数上使用带有 Async/Await 的 React 类字段

  9. 9

    JS:Async/await 似乎不会在循环中等待结果

  10. 10

    没有正确理解 async/await/promises 是如何工作的

  11. 11

    在React Native中使用async / await时出错

  12. 12

    在React JS中可以使用async / await吗?

  13. 13

    在 ES8 的 async/await 中包装 React 的 setState 函数

  14. 14

    WPF如何处理等待Async / Await响应的字段?

  15. 15

    WPF如何处理等待Async / Await响应的字段?

  16. 16

    如何使代码在以下 async/await 函数中等待?

  17. 17

    JS async await 不等待也不阻塞进程

  18. 18

    如何使用 async/await 进行错误处理而不必等待

  19. 19

    NodeJS Async/Await 不等待(返回 Promise 挂起)

  20. 20

    Async/await 在继续之前不会等待数据库查询

  21. 21

    httpclient async / await是否

  22. 22

    ReaderWriterLockSlim和async \ await

  23. 23

    EvaulateScriptAsPromiseAsync和async / await

  24. 24

    正确使用Async / Await

  25. 25

    Mongodb async await with express

  26. 26

    带有 TaskCompletionSource 和 async/await 的 UDP 协议

  27. 27

    我的代码中的 async/await 有什么问题吗

  28. 28

    Redux Action Creator 有什么更好的方法:.then 或 async/await 语法?

  29. 29

    Async / Await - 带有对象映射功能的承诺

热门标签

归档