转换 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;
}
}
我想将此 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;
}
}