当前位置: 首页 > 知识库问答 >
问题:

promise.all在与Async/Await一起使用时仅返回已解析的promise

元玮
2023-03-14

我正在尝试用Async/Await进行一些动态数据建模。我有两个endpoint,第一个将返回对象数组。数组中的这些实体具有从另一个endpoint获取的子实体。

所以我试图实现的结果类似于:

[{
  root: {
    id: 'root1'
  },
  children: [
    {
      id: 'child1'
    }, 
    {
      id: 'child2'
    }, 
  ]
}]

这就是我试图解决这个问题的方法:

  let data = await rootLevel();
  let levelOneData = [];
  levelOneData = data.map((e) => {
    let rootNode = {};
    rootNode["root"] = e;
    return rootNode;
  });

  let levelTwoData = await Promise.all(
    levelOneData.map(async (e) => {
      let response = await fetch(
        `APIURL{e.parent.ID}`
      );
      let responseJSON = response.json();
      e["children"] = responseJSON;
      return e;
    })
  );

  const rootLevel = async () => {
    let response = await fetch(
      `APIURL`
    );
    return response.json();
  };

我所期待的:

children: {Array(26)}

我得到的是:

children: Promise {<resolved>: Array(26)}

我不知何故监督了我的承诺.所有链,所以我只是在我的数据对象中获得解析的承诺,有没有关于如何在其中获得普通数据的提示?或者如何将一个数组解析的承诺变为实际数据?

共有1个答案

屈博
2023-03-14

更改此:

let responseJSON = response.json();

对此:

let responseJSON = await response.json();

response.json()是异步的,并返回一个承诺。你只是把这个承诺放在你的结果中,而不是等待它。

 类似资料:
  • 编辑:在测试用例5中,任务似乎处于状态。 我在.NET 4.5中使用System.net.http.HttpClient时遇到了一些奇怪的行为--其中“等待”调用的结果(例如)将永远不会返回。 只有在使用新的Async/Await语言功能和任务API的特定情况下才会出现这种情况--代码似乎总是在只使用延续时工作。

  • 问题内容: 以下 如何在React中与axios一起使用async / await 我试图在React.js应用程序中使用Async / Await向我的服务器发出一个简单的get请求。服务器加载一个简单的JSON ,看起来像这样 JSON格式 我可以使用简单的jquery ajax get方法将数据获取到我的React App。但是,我想利用axios库和Async / Await来遵循ES7标

  • 所以我一直很高兴地使用async/await,因为Firebase云函数支持节点8。不过我有一件事要做。当使用可调用函数时,会告诉您必须在函数中返回promise,否则它将无法正常工作。当使用原始promise时,我很清楚如何使用它: 但是现在,随着异步等待,我不确定如何返回这个“promise链”: 有人知道吗?

  • 问题内容: 我在ReactJS项目中一直在使用babel的async await。我发现可以方便地与React setState一起使用,我想更好地理解它。考虑以下代码: 我的意图是让异步验证代码在组件更新后运行。而且有效!生成的控制台日志显示: 验证代码仅在handleChange更新状态并呈现新状态后运行。 通常要在状态更新后运行代码,您必须在this.setState之后使用回调。这意味着,

  • 问题内容: 为了熟悉,我在Chrome中尝试了以下代码: 但不保存结果(字符串);而是持有一个需要再次等待的。这段代码确实给了我响应字符串: 如何使用await从函数返回实际的响应字符串? 问题答案: 要么 要么 这只是编写相同逻辑的另一种方法。

  • > < li >我在组织的租户azure环境中部署了一个ASP.NET(4.5)网站。 < li >它具有从网络位置(我们称之为nas驱动器)上传/下载/删除文件(任何类型)的功能,例如\nas8782\xyz\abc\ < li> 上传/下载/删除工作正常(参见下面的代码)。我们用的是CloudSdk。由我们的Azure团队创建的Azure库。 nasClient.UploadAsync nas