user11658838
user11658838

Reputation:

async/await and promise in TypeScript

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?

Upvotes: 7

Views: 21754

Answers (3)

Tobias
Tobias

Reputation: 238

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;
    }

Upvotes: 1

jeremy-denis
jeremy-denis

Reputation: 6878

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;
    })();
}

Upvotes: 1

JSON Derulo
JSON Derulo

Reputation: 17861

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;
}

Upvotes: 6

Related Questions