转换 Ember 函数以使用 ES2017 async/await

Convert Ember function to use ES2017 async/await

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

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

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;
      });
    }

您的代码,转换为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;
    }
}

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

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

与 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;
    }
}