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 进行方法链接 的相关文章

  • Canvas drawImage 内联 svg 在 Firefox 上不起作用

    这是一个例子 它采用 svg 并将其转换为画布 http jsfiddle net Na6X5 944 http jsfiddle net Na6X5 944 var can document getElementById canvas1
  • jQuery 插件与小部件

    几个月前 我开始使用 jQuery 插件进行一些实验 我在互联网上找到了一些教程 然后开始整理一些东西 几天前 我需要构建自己的 插件 并回到我的旧项目 当我试图在互联网上找到更多信息时 我偶然发现了这些称为小部件的新 东西 据我了解 我应
  • Draggable 正在阻止触摸事件

    我正在尝试使用拖动来来回移动 div 这部分工作正常 直到 div 具有可滚动内容 由于滚动条 这在桌面上不是问题 但在触摸设备上会出现问题 由于触摸事件与拖动事件冲突 我无法滚动内容 我尝试创建一个条件来检测拖动是否水平方向多于垂直方向
  • 旋转嵌套 SVG

    我在用SVG js http svgjs com并尝试使用 SVG 进行一些操作 我以前使用过 canvas 但我对其生成的图像质量非常失望 因此我决定使用纯 SVG 我设法将所有内容都改为纯 SVG 方法 除了一件事 旋转 我无法让它发挥
  • 在 HTML5 中堆叠多个画布

    我试图使用相互堆叠的四块画布 但除了顶部画布的内容外 它们的内容不会显示 我按照我希望它们显示的顺序将 z index 值放入其中 但只有最上面的一个显示内容 它们的位置是绝对的 z 索引是 1 2 3 和 4 是否还有其他原因导致它们不显
  • 如何在点击时添加和删除活动类 - 角度方式

    我正在这样做 div class tiles div 控制器 scope select function item scope selected item scope isActive function item return scope
  • 无法获取子 DOM 元素

    注 由于问题有点复杂 为了可读性对代码进行了抽象 We ve a
  • 查找第一个可滚动父级

    我遇到这种情况 需要将元素滚动到视口中 问题是我不知道哪个元素是可滚动的 例如 在纵向中 主体是可滚动的 而在横向中 它是另一个元素 还有更多情况会更改可滚动元素 现在的问题是 给定一个需要滚动到视口中的元素 找到其第一个可滚动父元素的最佳
  • React Native 中循环 Json 并显示

    How do I go about looping the result i retrieved from Json render function console log this state list contents
  • 指令可以从父作用域中删除自身吗

    假设我有以下代码 div div div div 我的自定义指令有一个独立的范围 定义为 app directive customDirective function log return restrict E templateUrl te
  • 在 Graal.js 中使用 java 类

    使用 Graal js 如何将 java 类导入到 JS 脚本中 以下代码适用于 Nashorn JJS 但不适用于 Graal js 因为没有Java type 在graal中 我需要在某个时候调用truffle吗 var ArrayLi
  • IE7 真的不支持indexOf javascript 吗? [复制]

    这个问题在这里已经有答案了 可能的重复 数组上的 indexOf 函数在使用 JavaScript 的 IE7 8 中不起作用 https stackoverflow com questions 11544983 indexof funct
  • 如何在不知道id的情况下从内页获取父iframe元素?

    让我们想象一下我有这样的东西 div div test html 是空页面 自定义hash属性始终具有不同的值 出于安全原因两个页面位于同一域 iframe 元素的数量和顺序是随机的 我的问
  • 接近堆限制的无效标记压缩分配失败 - JavaScript 堆内存不足

    我正在使用 Angular 7 2 当我进入ng serve 我面临以下问题 致命错误 接近堆限制的无效标记压缩分配失败 JavaScript 堆内存不足 这意味着什么 我该如何解决这个问题 完整的错误消息是 FATAL ERROR Ine
  • Magnific Popup:来自span的源标题

    我想从锚标记内的隐藏标题字段中获取放大图像的标题 而不是从标题中获取 这是因为我的标题包含标记 HTML a href img zoom jpg img src img small jpg alt span class hide This
  • 在 jQuery 中获取最接近元素的形式

    我编写了这个 js jquery 脚本来检查表单中的所有复选框 它工作得很好 但是这会检查页面上的所有复选框 无论它们是什么表单包装器 这是函数 function toggleCheck state var checkboxes jQuer
  • 当来自 Mozilla Firefox 和 MS Edge 上的剪贴板时 Alpha 会变成黑色

    我正在使用代码从这里 https stackoverflow com a 15369753 5875416将剪贴板中的图像粘贴到页面上 它在所有浏览器 Chrome Firefox Edge 和 Opera 中都能正常工作 问题是 当图像是
  • 仅在页面加载时执行 Javascript,而不是回发 (SharePoint)

    我正在尝试在 SharePoint 网站上的自定义页面上加载页面时执行一些 JavaScript 它使用当前用户填充人员选择器 问题是代码也在回发时执行 这是我不希望的 因为它会重置人员选择器的任何更改 我尝试过使用if IsPostBac
  • 是否可以对 Flexbox 插入、删除和项目位置进行动画处理?

    这个问题最初是在 2012 年提出的 https stackoverflow com questions 11106876 is it possible to animate flexbox inserts removes但是提供的答案并未
  • 如何从 fetch API 返回 json 响应

    我有一个像这样的函数 check auth fetch Urls check auth credentials include method GET then response gt if response ok return respon

随机推荐

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

    我尝试在 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