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?
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 => {
// ...