【问题标题】:Convert Ember function to use ES2017 async/await将 Ember 函数转换为使用 ES2017 async/await
【发布时间】:2018-11-12 11:09:07
【问题描述】:

我想将此 Ember 路由操作转换为使用 ES2017 异步/等待。有人可以解释一下这会是什么样子吗?

根据规范,我已经在我的 ember-cli-build.js 文件中添加了:babel: { includePolyfill: true }

save() {
      let tenant = this.modelFor(this.routeName).tenant;
      let app = this.modelFor(this.routeName).app;

      return tenant.save().then(()=> {
        return tenant.get('app').save({ adapterOptions: { tenantId: tenant.id }}).then(() => {
          this.transitionTo('tenants.tenant.info', tenant.id);
        }).catch((error) => {
          tenant.get('app').rollback();
          throw error;
        });
      }).catch((error) => {
        tenant.rollback();
        throw error;
      });
    }

【问题讨论】:

  • 更新:刚刚了解到,截至 2018 年 6 月 2 日,Ember 不支持代码中的 async/await。仅在测试中。 ember-concurrency 是下一个最佳选择。
  • 那不正确。你可以使用异步/等待。在某些情况下,仅测试是一个问题。究竟是什么不工作?
  • 这是正确的 @Lux ,您应该暂时避免在应用程序代码中使用 async/await ,除非您使用 babel polyfill 发货,使用本机承诺实现并且它没有运行-循环感知,对话最好在以下rfc 中捕获。 Tl;博士现在使用 ember-concurrencyember-co
  • 上述 cmets 的自动运行断言已被删除:github.com/emberjs/ember.js/pull/16797

标签: javascript ember.js ember-data ecmascript-2017


【解决方案1】:

与 Patrick Hund 写的答案非常相似,但将 catch 语句附加到正在等待的承诺,而不是包装在 try/catch 块中,并将错误逻辑提取到单个函数中。

async save() {
    let tenant = this.modelFor(this.routeName).tenant;
    let app = this.modelFor(this.routeName).app;

    await tenant.save().catch(handleError.bind(this, false));
    await tenant.get('app').save({ adapterOptions: { tenantId: tenant.id }})
                .catch(handleError.bind(this, true));

    this.transitionTo('tenants.tenant.info', tenant.id);

    // isApp is bound via bind; error will be provided when called via catch        
    function handleError(isApp, error) {
        if (isApp) {
            tenant.get('app').rollback();
        } else {
            tenant.rollback();
        }
        throw error;
    }
}

【讨论】:

    【解决方案2】:

    您的代码,转换为 async/await:

    async save() {
        let tenant = this.modelFor(this.routeName).tenant;
        let app = this.modelFor(this.routeName).app;
    
        try {
            await tenant.save();
    
            try {
                await tenant.get('app').save({ adapterOptions: { tenantId: tenant.id }});
                this.transitionTo('tenants.tenant.info', tenant.id);
            } catch (error) {
                tenant.get('app').rollback();
                throw error;
            }
        } catch (error) {
            tenant.rollback();
            throw error;
        }
    }
    

    要从 Promise 转换,您将 await 关键字添加到返回 Promise 的方法调用中。您在 Promise 的 then 方法中放置的所有内容都可以简单地放在 await 语句之后。

    promise 的 catch 方法转换为常规的 try/catch 块。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-19
      • 2016-02-26
      • 1970-01-01
      • 2015-09-26
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多