async/await 和 ES6 生成器的收益之间的区别

2024-01-08

我刚刚读了这篇精彩的文章 «发电机 https://www.promisejs.org/generators» 它清楚地突出显示了这个函数,它是一个用于处理生成器函数的辅助函数:

function async(makeGenerator){
  return function () {
    var generator = makeGenerator.apply(this, arguments);

    function handle(result){
      // result => { done: [Boolean], value: [Object] }
      if (result.done) return Promise.resolve(result.value);

      return Promise.resolve(result.value).then(function (res){
        return handle(generator.next(res));
      }, function (err){
        return handle(generator.throw(err));
      });
    }

    try {
      return handle(generator.next());
    } catch (ex) {
      return Promise.reject(ex);
    }
  }
}

我假设这或多或少是这样的async关键字的实现是async/await.那么问题来了,如果是这样的话,那么两者之间到底有什么区别呢?await关键字和yield关键词?做await总是把某事变成承诺,而yield没有做出这样的保证吗?这是我最好的猜测!

您还可以查看如何async/await类似于yield在这篇文章中使用生成器,他描述了“spawn”函数ES7 异步函数 https://jakearchibald.com/2014/es7-async-functions.


嗯,事实证明,两者之间有着非常密切的关系。async/await和发电机。而且我相信async/await将始终建立在发电机上。如果你看看 Babel 转译的方式async/await:

巴别塔采取了这个:

this.it('is a test', async function () {

    const foo = await 3;
    const bar = await new Promise(resolve => resolve('7'));
    const baz = bar * foo;
    console.log(baz);

});

并将其变成这样

function _asyncToGenerator(fn) {
    return function () {
        var gen = fn.apply(this, arguments);
        return new Promise(function (resolve, reject) {
            function step(key, arg) {
                try {
                    var info = gen[key](arg);
                    var value = info.value;
                } catch (error) {
                    reject(error);
                    return;
                }
                if (info.done) {
                    resolve(value);
                } else {
                    return Promise.resolve(value).then(function (value) {
                        return step("next", value);
                    }, function (err) {
                        return step("throw", err);
                    });
                }
            }

            return step("next");
        });
    };
}


this.it('is a test', _asyncToGenerator(function* () {   // << now it's a generator

    const foo = yield 3;    //  <<< now it's yield, not await
    const bar = yield new Promise(resolve => resolve(7));
    const baz = bar * foo;
    console.log(baz);

}));

你算一下。

这使得它看起来像async关键字只是包装函数,但如果是这样的话await只是变成了yield,当他们成为本地人后,图片可能会更多一些。

您可以在这里查看更多解释:https://www.promisejs.org/generators/ https://www.promisejs.org/generators/

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

async/await 和 ES6 生成器的收益之间的区别 的相关文章

随机推荐

  • 文本超出 JTextArea

    我正在尝试用 Java 做一些事情 这需要我在 ScrollPane 中有一个 JTextArea 我是这样定义它们的 private JTextArea longestparagraph new JTextArea JScrollPane
  • 我正在为我的团队编写编程思维规则:你的是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动
  • 用jQuery实现文件上传进度条

    我正在尝试在我的项目中实现 AJAX 文件上传功能 我为此使用 jQuery 我的代码使用 AJAX 提交数据 我还想实现一个文件上传进度条 我怎样才能做到这一点 有什么方法可以计算已上传的数量 以便我可以计算上传的百分比并创建进度条 我只
  • 使用 SQL 查询统计单词出现次数

    我有两张桌子 Table1 ID SENTENCE 1 The shoes are good shoes 2 There is a tree 3 This is nice nice nice Table2 ID WORD 1 The 1 s
  • 三元组存储和图数据库有什么区别?

    有三元组 语义数据库 也有通用图形数据库 两者都基于通过关系将一个 项目 链接到另一个 项目 的类似概念 Triplestore 支持 RDF 并由 SPARQL 查询 但此类附加组件也可以 并且已经 在通用图形数据库之上实现 使您更喜欢语
  • 如何将 WebDev.WebServer.exe 安装为独立应用程序?

    如何将 Visual Studio Web 开发服务器 WebDev WebServer exe 安装为独立应用程序 这样我们的网页设计人员就可以从 SVN 获取最新的代码 然后运行 MSBuild 批处理文件来构建代码 然后使用 Web
  • 如何使用 Mockito 验证未调用特定方法?

    如何验证一个方法是not调用对象的依赖关系 例如 public interface Dependency void someMethod public class Foo public bar final Dependency d 通过 F
  • 跨进程发送对象在解组时抛出 Class not found

    我正在编码和android应用程序有2个进程 一个显然是处理所有UI事物和其他事物的主进程 另一个进程托管处理网络 套接字 监听和其他事物的服务 为了跨两个进程进行通信 我使用 Messenger 方法 并且在需要发送自定义 java 对象
  • sweetalert2 在同一函数中使用多个 swal

    我想制定一个条件并为每个条件调用一个 swal Sweetalert2 但只有一只天鹅在奔跑 我该怎么做 function validateEmail email var regex S S S return regex test emai
  • 动态组装模型的 Code First 迁移

    我的数据库模型 有时称为 context 在启动时根据安装的服务和 或插件动态组装 插件和服务通过我的 IoC 容器导出它们的模型定义片段 应用程序核心会在启动时拾取它们并运行它们 DbContext OnModelCreating方法被调
  • 如何为 Mac OS 创建 .app 单包

    我正在尝试为我的 mono 程序创建一个 app 捆绑包以在 Mac OS X 上运行 但尽管阅读了几乎所有有关 macpack 和捆绑 mono 的文章和文档 但这些方法都不起作用 使用 macpack 将二进制文件成功捆绑到 app 包
  • 使用属性文件代替静态最终变量

    我有许多带有静态最终字段的类 它们用作默认值或配置 创建全局配置文件的最佳方法是什么 我应该将这些字段移至单个静态类 使用属性文件还是什么 编辑 我需要在 java 类和 xhtml 页面中使用这个值 价值观不依赖于环境 我可以编译项目来设
  • Electron 和 window 之间的 IPC 通信不起作用

    我正在尝试编写我的第一个基于 Electron Boilerplate 的 Electron 应用程序 我正在尝试从主 Electron 进程发送一条简单的消息到我的窗口中 但似乎该消息没有发送 我所执行的主要代码如下 background
  • 在夏时制时将日期移动一小时

    我正在逐行处理文件 每行都有一个日期 格式如下 YYMMDD HHMM 该文件基本上每 15 分钟记录一次读数 录制时使用了所在时区的夏令时 我遇到的问题是在春季和秋季期间 记录是重复发生回退时的日期和发生回退时的间隙 后备示例 14110
  • 使用Jersey客户端进行POST操作

    在 Java 方法中 我想使用 Jersey 客户端对象对 RESTful Web 服务 也使用 Jersey 编写 执行 POST 操作 但不确定如何使用客户端发送将用作 FormParam 的值在服务器上 我可以很好地发送查询参数 我自
  • 模板和自定义功能;恐慌:函数未定义

    Using html template我正在尝试在模板中使用我自己的函数之一 不幸的是我无法使用 go 模板的函数映射功能 我得到的只是以下错误 go run test go panic template tmpl html 5 funct
  • 二叉搜索树的递归中序遍历

    我想在二叉搜索树 BST 中实现递归中序 我使用两个结构构建了一棵树 Node and Tree 我的代码到目前为止还没有工作 主要是因为类型不匹配Node inorder pub struct Node
  • 导出所有 Azure AD 组及其成员 (PowerShell)

    我见过很多关于导出群组和获取成员的帖子 但奇怪的是不是两者都涉及 基本上 我需要每个 AD 组及其相应成员的 csv 文件或类似文件 我认为这需要从 Azure 完成 因为我们有多个域和 Office 365 incloud 组 Azure
  • 使用 Python 从 PDF 中提取文本及其字体详细信息(样式、大小、颜色、斜体等)[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我希望使用 Python 从 PDF 中提取文本及其字体详细信息 样式 大小 颜色 斜体等 我需要提取文本及其元数据以用于翻译目的 任何人
  • async/await 和 ES6 生成器的收益之间的区别

    我刚刚读了这篇精彩的文章 发电机 https www promisejs org generators 它清楚地突出显示了这个函数 它是一个用于处理生成器函数的辅助函数 function async makeGenerator return