Home > Blockchain >  async/await and promise in TypeScript
async/await and promise in TypeScript

Time:10-29

I am trying to understand why the return type string in the following method is underlined red as error:

exportPageAsText(pageNumber: number): string {
        (async () => {
            const text = await this.pdfViewerService.getPageAsText(pageNumber);
            console.log(text);
            return text;
        })();
}

The error message reads: A function whose declared type is neither 'void' nor 'any' must return a value. so I moved return text; out of the async scope and placed it after })(); but that made the text variable unrecognizable.

Then I thought maybe it's because the method return type should be a Promise so I changed the signature to:

exportPageAsText(pageNumber: number): Promise<string>

But I get a new error saying that A function whose declared type is neither 'void' nor 'any' must return a value.

Can someone please help me understand what I am doing wrong?

CodePudding user response:

You want to use await, so you need an async function. What you created is a self-invoking async function. But returning a value inside the self-invoking function does not return it for the base function.

What you are looking for is to make the base function async, and setting the return type to Promise<string>:

async exportPageAsText(pageNumber: number): Promise<string> {
  const text = await this.pdfViewerService.getPageAsText(pageNumber);
  console.log(text);
  return text;
}

CodePudding user response:

Your method wait a return before the end but event the promise declared by async () => {... is not returned

so two thing to change in your code

  1. return the async()
  2. change the type of return in the methode declaration by Promise<string>

In your case syntax it will look like

exportPageAsText(pageNumber: number): Promise<string> {
    return (async () => {
        const text = await this.pdfViewerService.getPageAsText(pageNumber);
        console.log(text);
        return text;
    })();
}

CodePudding user response:

This is how I would have done it. async/await.

    const exportPageAsText = async (pageNumber: number): Promise<string> => {
        const text: string = await this.pdfViewerService.getPageAsText(pageNumber);
        console.log(text);
        return text;
    }

CodePudding user response:

You want to use await, so you need an async function. What you created is a self-invoking async function. But this way you can't return anything.

What you are looking for is to make the base function async, and setting the return type to Promise:

exportPageAsText(pageNumber: number): Promise<string> {
    return (async () => {
        const text = await this.pdfViewerService.getPageAsText(pageNumber);
        console.log(text);
        return text;
    })();
}
  • Related