Reputation:
I have the following function:
private bindSemanticObject(unom: number) {
this.setSemanticService
.bindObjectsSemanticByUnom(unom)
.then(
(addressSemantic) => {
try {
this.setSemanticService.setAddressSemantic(addressSemantic);
this.setSemanticService.verifySemanticObject();
this.setSemanticService.setSemanticFields();
this.setSemanticService.saveSemantic().then(() => {
this.setSemanticService
.stateChangeBindObject()
.toPromise()
.then(() => {});
this.toastrService.success('Updated...');
this.editLayerFactory.destroy(false);
});
} catch (e) {
console.log(e);
}
},
(e) => {
this.toastrService.warning(e);
},
)
.catch((e) => console.log(e));
}
As you can notice this code has some .catch
and one error
block. How to simplify it and makre more readable?
Upvotes: 0
Views: 150
Reputation: 1074058
Here in 2022, you can markedly simplify that code using async
/await
, like this:
private async bindSemanticObject(unom: number) {
try {
const addressSemantic = await this.setSemanticService
.bindObjectsSemanticByUnom(unom);
this.setSemanticService.setAddressSemantic(addressSemantic);
this.setSemanticService.verifySemanticObject();
this.setSemanticService.setSemanticFields();
await this.setSemanticService.saveSemantic();
try {
await this.setSemanticService
.stateChangeBindObject()
.toPromise();
} catch {
// You've said in a comment you don't care about
// rejections on the part above
}
this.toastrService.success('Updated...');
this.editLayerFactory.destroy(false);
} catch (e) {
this.toastrService.warning(e);
}
}
A few notes on that:
this.setSemanticService().stateChangeBindObject.toPromise()
, so I've wrapped it in an inner try
/catch
.try
/catch
will catch both synchronous errors thrown by the code and promise rejections (because of await
).If you can't use async
/await
for whatever reason, you can use a series of then
handlers:
private bindSemanticObject(unom: number) {
return this.setSemanticService
.bindObjectsSemanticByUnom(unom)
.then(addressSemantic => {
this.setSemanticService.setAddressSemantic(addressSemantic);
this.setSemanticService.verifySemanticObject();
this.setSemanticService.setSemanticFields();
return this.setSemanticService.saveSemantic();
})
.then(() => {
return this.setSemanticService
.stateChangeBindObject()
.toPromise()
.catch(() => { /*...suppress...*/ });
})
.then(() => {
this.toastrService.success('Updated...');
this.editLayerFactory.destroy(false);
})
.catch(e => {
this.toastrService.warning(e);
});
}
That's not quite the same, it doesn't handle a synchronous error from the initial this.setSemanticService.bindObjectsSemanticByUnom(unom)
. If you need to handle that, change the beginning to:
private bindSemanticObject(unom: number) {
return Promise.resolve().then(() =>
this.setSemanticService
.bindObjectsSemanticByUnom(unom)
)
.then(addressSemantic => {
// ...
Upvotes: 2