Функция преобразования Ember для использования ES2017 async / await - PullRequest
0 голосов
/ 02 июня 2018

Я хотел бы преобразовать это действие маршрута 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;
      });
    }

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Очень похоже на ответ, который написал Патрик Ханд, но присоединяет операторы 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;
    }
}
0 голосов
/ 03 июня 2018

Ваш код, преобразованный в 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 к вызовам методов, которые возвращают обещания.Все, что вы помещаете в метод обещания then, вы можете просто поместить после оператора await.

Методы обещания catch преобразуются в обычные блоки try / catch.

...