如何让 async/await 等待 Observable 返回

2024-01-30

对 Angular 相当陌生,并且在 Promises、Observables 和 async/await 方面遇到困难。

  • 我有一个功能需要当前用户详细信息来执行某些任务。
  • 为此,我编写了一个获取用户详细信息方法,该方法返回一个承诺,并且任务在“then”部分内处理。
  • fetch 方法本身调用另一个方法,该方法调用 http.get 从数据库获取用户详细信息,并返回一个 Observable。
  • 我在这里使用 async/await 函数来等待 http.get 返回。

然而,这似乎不起作用。我感觉这与 Observables/subscribe 的工作方式有关,但我无法解决它。

代码片段:

    initPage() {
      fetchCurrentUserDetails().then((user) => { //tasks dependent on current user
        //task 1
        //task 2
      });
    }

    fetchCurrentUserDetails(): Promise<any> {
      return Promise.resolve((async () => {
        let currentUser = this.global.getUser();// check if user is defined already
        let userId: string = sessionStorage.getItem('userid');

        if (currentUser == undefined) {
          let initProfile = new Promise(resolve => resolve(this.fetchDetailsFromDB(userId)));
          const profile: any = await initProfile; //Waits, but returns before the Observable comes back

          let user = new User();
          // initialize user with the fetched values
          user.id = profile.id; // Undefined, since value not returned yet
          user.name = profile.user_name; // Undefined, since value not returned yet
          // Set this user in a global variable
          this.global.setUser(user);
       }

       return this.global.getUser();
      })());
    }

    fetchDetailsFromDB(userId: string) {
      //callProfileService has nothing but the http.get statement
      this.callProfileService(userId).subscribe((response) => {
        let profile = response.body.response.data.user;
         return profile;
      });
    }


编辑:添加我如何尝试使用 toPromise:

    fetchDetailsFromDB(userId: string) {
      this.callUserProfileService(userId).toPromise().then((response) => {
       let profile = response.body.response.data.user;
       return profile;
    });

这是正确的方法吗?如果是这样,如何让await等待Observable返回?


确实,您需要toPromise()方法,但不要忘记return那个承诺(return在回调中还不够——函数fetchDetailsFromDB需要return一个承诺)。

在代码的其余部分:它是一种反模式Promise.resolve and new Promise像这样:根据经验,当您已经有一个可以使用的 Promise(例如,来自 API 函数调用)时,不要使用其中任何一个创建新的 Promise。

所以你可以这样做async方法:

async fetchCurrentUserDetails(): Promise<any> {
//^^^^
    let currentUser = this.global.getUser();
    if (currentUser == undefined) {
      const userId: string = sessionStorage.getItem('userid');
      const profile: any = await this.fetchDetailsFromDB(userId);
      currentUser = new User();
      currentUser.id = profile.id;
      currentUser.name = profile.user_name;
      this.global.setUser(currentUser);
   }
   return currentUser;
}

async fetchDetailsFromDB(userId: string): Promise<any> {
   const response = await this.callUserProfileService(userId).toPromise();
   return response.body.response.data.user;
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让 async/await 等待 Observable 返回 的相关文章

  • 动态速度计 javascript 或 jquery 插件

    我希望有动态ajax插件在页面上显示速度计 一个想法是我设置一个背景并旋转针 有人知道相关插件吗 这里有一些供您参考 http bernii github com gauge js http bernii github com gauge
  • 网站 YouTube 嵌入视频不断播放

    我正在使用 youtube 提供的 iframe 在我的网站上嵌入视频 我还使用了一个 css 弹出窗口 这是我从这个页面学到的http www pat burt com web development how to do a css po
  • 非 DOM 对象上的 jQuery 自定义事件

    我最近阅读了一些代码 其功能如下 bob name Bob Smith rank 7 bob bind nameChanged function bob trigger nameChanged 这似乎有效 但我在 jQuery 文档或源代码
  • Node js 使用中间件重定向进行过多重定向

    在我的 Node js 应用程序 我使用的是express 4 x 中 我想检查用户是否已登录 如果用户未登录 我想重定向到我的登录页面 然后我在中间件中这样做 服务器 js app use function req res next if
  • 在Javascript中按降序对字符串进行排序(最有效)?

    W3Schools 有这个例子 var fruits Banana Orange Apple Mango fruits sort fruits reverse 这是在 Javascript 中按降序对字符串进行排序的最有效方法吗 Updat
  • jQuery 选择 # id 以单词为前缀,计数器为后缀

    有没有办法用 jQuery 选择所有带有前缀 my 和后缀 0 9 的 id 像这样的 my 1 4 还是可以用循环来实现 div div div div div div div div div div 第一个想法 似乎效果很好 div i
  • 动画进度元素值

    我有一个progress元素 该元素如下所示 div class container div div div
  • 检查 touchend 是否在拖动后出现

    我有一些代码可以更改表的类 在手机上 有时表格对于屏幕来说太宽 用户将拖动 滚动来查看内容 但是 当他们触摸并拖动表格时 每次拖动都会触发 touchend 如何测试触摸端是否是触摸拖动的结果 我尝试跟踪dragstart和dragend
  • 是否可以使用 javascript 测试用户的浏览器/操作系统是否支持给定类型的链接?

    是否可以使用 javascript 或其他任何东西 测试用户的操作系统 浏览器是否支持给定的 url 方案 例如 大多数仅使用网络邮件的用户计算机上未设置 mailto 是否有可能以某种方式捕获单击 mailto 链接的尝试并弹出比浏览器错
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • 通过 node-http-proxy 保留基于 cookie 的会话

    我有一个简单的基于 Express 的 Node js Web 服务器 用于开发 JavaScript 应用程序 我将服务器设置为使用 node http proxy 来代理应用程序向在不同域和端口上运行的 Jetty 服务器发出的 API
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • Typeahead.js substringMatcher 函数说明

    我只是在做一些研究Typeahead js这是一个非常酷的图书馆 感谢文档 我已经成功地获得了一个基本的示例 该文档也非常好 但是我试图弄清楚以下代码块实际上在做什么 var substringMatcher function strs r
  • 查询为空 Node Js Sequelize

    我正在尝试更新 Node js 应用程序中的数据 我和邮递员测试过 我的开发步骤是 从数据库 MySQL 获取ID为10的数据进行更新 gt gt 未处理的拒绝SequelizeDatabaseError 查询为空 我认识到 我使用了错误的
  • 当用户单击链接时,如何记录 MixPanel 事件?

    当用户单击某种类型的链接时 我试图在 MixPanel 中记录一个事件 我正在使用 JQuery 不引人注意地完成此操作 据我所知 我需要添加一个回调函数 以便在记录事件后将用户带到 URL 这是我正在使用的代码 不幸的是
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas
  • 如何在打字稿文件中导入没有定义文件的js库

    随着我们的项目变得越来越大 我想从 JavaScript 切换到 TypeScript 以帮助进行代码管理 然而 我们使用许多库作为 amd 模块 我们不想将其转换为 TypeScript 我们仍然想将它们导入 TypeScript 文件
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗

随机推荐

  • 使用 Nodejs 面对 api

    我正在使用使用 Node js 的 Azure Face api 下面是代码 然而 我想使用本地图像并发布它 而不是托管一些图像 我尝试了不同的选项 但它无法识别图像格式或无效的图像网址 以下是我尝试过的事情 1 var stream fs
  • 知道hadoop中数据节点的磁盘空间吗?

    有没有一种方法或任何命令可以让我了解每个数据节点的磁盘空间或总集群磁盘空间 我尝试了命令 dfs du h 但似乎我没有权限对许多目录执行它 因此无法获取实际的磁盘空间 From UI http namenode 50070 dfsheal
  • 为什么在 JpaTransactionManager 中使用 jpadialect

    我正在从 Spring in Action 学习 spring 3 0 那里讨论了在 JpaTranactionManager 中使用 jpadialect 的重要性
  • 使用 !source 的 gitconfig 别名不起作用 (zsh)

    我有一个像这样的 gitconfig alias l source githelpers pretty git log 当我运行它时 我得到这个 desktop git l source githelpers pretty git log
  • 设置 geopandas 地图的中心

    我可以用 geopandas 绘制世界地图 world geopandas read file geopandas datasets get path naturalearth lowres fig ax plt subplots worl
  • 使用 opencart 获取多商店设置的商店 ID

    我们设置了多个商店 我想稍微更改每个商店的模板 我仔细查看了已经存在的代码并发现了这些 this gt config gt get config store id this gt load gt model setting store re
  • 如何获取 Windows 版的 python-dev?

    我们正在尝试安装 PIL 并收到错误 error command gcc failed with exit status 1 许多类似的问题 包括这个 安装 Reportlab 错误 命令 gcc 失败 退出状态为 1 https stac
  • 如何在“

    余烬绑定数据属性指南 https guides emberjs com v2 10 0 templates binding element attributes 说 如果您使用带有布尔值的数据绑定 它将添加或删除指定的属性 我正在尝试使用此
  • 哪个系统调用返回连接到 Linux 系统的设备列表?

    我正在尝试编写一个 C Java 程序 它将显示连接到系统的设备列表 非常感谢在这方面的任何帮助 lsusb http www cyberciti biz faq linux how do i list all usb devices 命令
  • iOS EXC_BAD_ACCESS:如何调试?

    我收到 EXC BAD ACCESS 我知道这通常意味着什么 尝试访问 不再 的对象是最可能的原因 那么 我在哪里可以找到它 我在网上看了很多帖子 他们都说 方案中 启用 NSZombie 现在 当我运行调试器时 我应该查看什么 我看不出有
  • Thread.join 和 Synchronized 有什么区别?

    我很困惑何时使用Thread join 以及何时使用synchronization在多线程应用程序中 根据我的说法 它们都阻塞或等待其他线程完成执行 此示例必须按顺序模式依次输出 10 个 A 10 个 B 和 10 个 C 如下所示 1
  • template 与 template 不匹配是一个缺陷吗?

    在探索的同时这个答案 https stackoverflow com a 47730794 1366368我发现采用参数包的模板不会被需要具有特定数量参数的模板的模板所接受 在我看来 这是一个缺陷 因为如果模板可以采用任意数量的参数 它应该
  • 在纹理数组中绘制Texture2D图集

    如何通过 GLSL Sampler 仅绘制存储在纹理数组中的纹理2D 图集的一部分 例如 我有纹理图集 我会将它们放在一起 与相同大小的其他图集 在Texture2D数组里面 glTexSubImage3D 那么 在这种情况下我的采样器应该
  • 为什么我们需要快速正文解析器?

    我遇到了很多博客和文章 他们建议使用 body parser 来解析请求正文数据 有没有办法在不使用任何中间件的情况下解析数据或从正文获取正文数据 默认情况下 express 只为您提供原始 HTTP 请求正文req论证作为Incoming
  • Lambda 没有自动推断返回类型

    当我回答我自己的问题时https stackoverflow com a 32115498 383779 https stackoverflow com a 32115498 383779 我又有一个疑问了 In const CArray
  • 如何逐行运行Linux程序

    我想使用一些调试器逐行运行 GTK C 程序 我从未调试过 Linux 程序 那么在哪里可以找到针对初学者如何调试代码的说明呢 我只是有一个想法 我必须从网上下载源代码 使用调试符号编译项目并通过 DDD 或 GDB 运行源代码 那么任何人
  • 切换当前元素的可见性

    我正在尝试写一个函数toggle active单击即可显示隐藏内容 再单击一次即可再次折叠内容 可悲的是 它不起作用 你能帮我修改一下吗 function toggle active this var x this nextSibling
  • XDebug 无法在 VScode 中进行 php 调试

    即使在所有配置之后 使用 xdebug 和 xampp 在 vscode 中进行 PHP 调试也无法正常工作 这是我的 php ini 文件配置 zend extension D Xampp php ext php xdebug 3 0 0
  • CakePHP 中页面别名的自动路由

    我正在使用 CakePHP 框架创建一个 CMS 通过 CMS 创建的每个页面都将有其唯一的 URL 别名 这还取决于虚拟文件夹结构 例如 www site com level 1 about us www site com level 2
  • 如何让 async/await 等待 Observable 返回

    对 Angular 相当陌生 并且在 Promises Observables 和 async await 方面遇到困难 我有一个功能需要当前用户详细信息来执行某些任务 为此 我编写了一个获取用户详细信息方法 该方法返回一个承诺 并且任务在