TypeScript 中使用 async/await 进行方法链接

2023-11-25

我遇到一种情况,我需要对异步方法的结果调用异步方法。

class Parent {
  constructor(private child: Child) { }

  private getChild(): Promise<Child> {
    return Promise.resolve(this.child);
  }

  async getResult(): Promise<Child> {
     return await this.getChild()
  }
}

class Child {
  getText(): Promise<string> {
    return Promise.resolve('text');
  }
}

let child = new Child();
let container = new Parent(child);

let printText = async () => {
  await (await container.getResult()).getText();
}

printText();

有没有好的方法可以避免双重等待?我想我想做await container.getChild().getText();。在 TypeScript 中创建 API 的正确方法是什么,该 API 允许我链接返回 Promise 的方法,然后通过单个等待等待结果?

编辑:澄清一下,这更多的是一个 API 设计问题。是否有更好的模式来完成我想做的事情(在异步方法返回的对象上调用异步方法)?即使这意味着做一些完全不同的事情?


有没有办法更好地设计我的 API,以便用户不需要双重等待?即使这意味着彻底改变我的示例的结构。

你一定不能让getResult异步,它需要返回一个Result立即实例化,以便可以对其调用进一步的方法。你的例子有点奇怪,因为getChild实际上根本不需要异步。但让我们假设它是,并且做了一些重要的事情。

然后你可以写

class Parent {
  private async getChild(): Promise<Child> {
    … // whatever
  }

  getResult(): Result {
     return new Result(this.getChild())
  }
}
class Result {
  constructor(p: Child) {
    this.promise = p;
  }
  async getText(): Promise<string> {
    return (await this.promise).getText();
  }
}

现在你可以打电话parent.getResult().getText()直接地。基本上,Result充当代理包装器Child完成这两个等待的类。也许在你的实际架构中你甚至可以避免this.promise并一步完成子访问和文本访问。

然而,通常这是不值得的。只需让您的来电者await每一步。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TypeScript 中使用 async/await 进行方法链接 的相关文章

随机推荐

  • 自动映射器异常:“缺少类型映射配置或不支持的映射。”

    我尝试在 ASP NET MVC 5 应用程序中使用 Ninject 该应用程序使用 AutoMapper 将模型映射到视图模型 反之亦然 不幸的是 我收到一条错误消息 指出缺少类型映射配置 我创建了一个 Ninject 依赖解析器 nam
  • 如何以编程方式设置 dp 中的 EditText 上边距?

    在我的 Android 应用程序中 我想更改 editText 的 topMargin 问题是我想改变它 dp 明智而不是像素明智 我只想更改 topMaring 让另一个保持原样 不将它们设置为零 以编程方式我只能在 int 中设置边距
  • 提升无锁 spsc_queue 缓存内存访问

    我需要非常关注当前多线程项目中的速度 延迟 我试图更好地理解缓存访问 我不清楚无锁队列 例如 boost lockfree spsc queue 如何在缓存级别访问 使用内存 我见过使用队列 其中需要由消费者核心操作的大对象的指针被推入队列
  • 有没有办法使用“请求”通过 python 调用 Azure Devops?

    所以 从我所看到的大多数sources 他们说如果您尝试让 python 程序调用 azure devops api 调用 它会使用 python import 语句 例如 from azure devops connection impo
  • 如何使用android PhoneGap上传文件?

    我使用 Android PhoneGap 创建了应用程序 我想上传文件 即 当我单击上传按钮时 文件选择对话框将打开 然后我选择文件 然后单击该对话框中的打开按钮 我在phonegap API中使用文件传输 但输出不是这样的 如何修改pho
  • 如何在 Silverlight 上显示 tiff 文件?

    如何在 Silverlight 应用程序上显示 tiff 文件 我可以显示除 tiff 之外的任何图像格式 有人可以帮助我吗 谢谢 我成功地在 Silverlight 中显示 TIFF 免费移植很容易LibTiff NET库到 Silver
  • SQL Server - 遇到 0 时重置的累积总和

    我想对列进行累积和 但每当遇到 0 时都会重置聚合值 这是我尝试做的一个例子 该数据集 pk price 1 10 2 15 3 0 4 10 5 5 给出这个 pk price 1 10 2 25 3 0 4 10 5 15 在 SQL
  • Sublime Text 控制台不显示带重音符号的行

    在 Sublime Text 2 和 3 中 控制台输出不显示带有重音符号的行 我在用着Tools gt Build在 Windows 中的 vanilla Sublime 中 使用自动构建系统来执行它 有什么解决办法吗 将文档中标准系统输
  • 如何使用带有尾随空格的内联代码?

    当我使用 在我的 Sphinx 文档中 我收到以下警告 WARNING Inline literal start string without end string Trying samp leads to WARNING Inline i
  • 无法运行 Flask 文档中引用的示例代码

    我正在阅读 Flask 文档 并希望使用他们在 git 存储库中引用的示例 但是 教程与存储库中的代码不匹配 我无法运行它们 我收到以下错误 app cli command initdb AttributeError Flask objec
  • ggplot2中的渐变填充

    说一下是否有以下情节 library ggplot2 n lt 1169 df22 lt data frame x 1 n val seq 0 0 5 length out n type 1 ggplot df22 aes x x y va
  • 手臂。从超级用户模式访问用户 R13 和 R14

    如何访问进入管理员模式时保存的用户R13和R14 我使用的是 ARM7TDMI IE 我不想访问管理程序 R14 它现在包含用户模式的返回地址 而是想要用户模式链接寄存器的值 这是我正在编写的调试器的一部分 这些寄存器有特殊的别名吗 Tha
  • ImportError:尝试安装软件包时没有名为 pip 的模块

    使用 PyCharm 全新安装 Ubuntu 13 10 在设置 python 解释器时 我选择了 安装 setuptools 然后选择 安装 pip 现在 如果我尝试使用 pip 执行任何操作 我会得到以下结果 ciaran ciaran
  • 在管理站点中创建隐藏字段

    如何在管理站点中创建完全隐藏的字段 输入和标签 我知道关于exclude属性 但它完全从模板中排除该字段 而我在网页中需要它 但隐藏 class OutForm ModelForm reply to forms ModelChoiceFie
  • Cocoa:模拟 Macbook 上键和多媒体键

    我正在尝试使用以下命令模拟任何活动应用程序的上部 Macbook 键 CGEventCreateKeyboardEvent NULL CGKeyCode keycode true CGEventCreateKeyboardEvent NUL
  • 如何使 wxFrame 表现得像模态 wxDialog 对象

    是否可以使 wxFrame 对象表现得像模态对话框 创建 wxFrame 对象的窗口停止执行 直到 wxFrame 对象退出 我正在研究一个小游戏并遇到了以下问题 我有一个主程序窗口 用于托管主应用程序 战略部分 有时 我需要将控制权转移到
  • 在数组上使用 preg_replace

    我有一个相对较大的元素数组 我想搜索字符串并替换任何匹配项 我目前正在尝试使用preg replace和正则表达式 preg replace d dIPT w IPT array 我想获得所有匹配的值00IPT A or 0IPT A wi
  • 如何克服 - pip install ansible 在 Windows 上失败,文件名或扩展名太长

    如何修复 Windows 上的 pip 安装失败并出现以下错误 尝试安装 ansible 时出现此错误 我怀疑这是选择安装的 pip 软件包的问题 但在基于 Linux 的系统上同样可以正常工作 pip install 与操作系统有什么区别
  • 如何编写 Windows 批处理脚本来从目录复制最新文件?

    我需要将目录中的最新文件复制到新位置 到目前为止我已经找到了资源forfiles命令 一个与日期相关的问题这里 还有另一个相关问题 我只是在将各个部分组合在一起时遇到了一些麻烦 如何将该目录中的最新文件复制到新位置 接受的答案给出了在命令中
  • TypeScript 中使用 async/await 进行方法链接

    我遇到一种情况 我需要对异步方法的结果调用异步方法 class Parent constructor private child Child private getChild Promise