I have a situation where I need to call an async method on the result of an async method.
class Parent {
constructor(private child: Child) { }
private getChild(): Promise<Child> {
return Promise.resolve(this.child);
}
async getResult(): Promise<Child> {
return await this.getChild()
}
}
class Child {
getText(): Promise<string> {
return Promise.resolve('text');
}
}
let child = new Child();
let container = new Parent(child);
let printText = async () => {
await (await container.getResult()).getText();
}
printText();
Is there a good way to avoid the need to double await? I think I'd like to just do await container.getChild().getText();
. What's the right way to make an API in TypeScript that will allow me to chain methods that return promises and then wait for the result with a single await?
EDIT: To clarify, this is more of an API design question. Is there a better pattern for doing what I'm trying to do (call an async method on an object returned by an async method)? Even if it means doing something totally different?
You must not make
getResult
asynchronous, it needs to return aResult
instance right away so that further methods can be called on it. Your example is a bit weird sincegetChild
doesn't really need to be asynchronous at all. But lets assume it is, and does some important.You then could write
Now you can call
parent.getResult().getText()
directly. Basically,Result
acts as a proxy wrapper around theChild
class that does both the awaits. Maybe in your actual architecture you can even avoid thethis.promise
and do the child and text accesses in one step.However, usually this is not worth it. Just let your caller
await
each step.