Search code examples
typescriptes6-promise

how to return promise from an async code block


I want to send an http request and return the result using typescript, before send the http request, I want to get the token from google chrome local storage and put the token into http header. This is my typescript code looks like:

api_post:<T>(url: string, data: any): Promise<T> => {
    chrome.storage.local.get("token", function (result:any) {
        return fetch(url, {
            method: 'POST',
            headers: {
                'Content-type': 'application/json',
                'x-access-token': result,
            },
            body: JSON.stringify(data),
        })
            .then(response => {
                if (!response.ok) {
                    throw new Error(response.statusText);
                }
                return response.json() as Promise<T>;
            });
    });  
},

the problem is the promise return from the inner of an async code block, this function shows error:

interface Promise<T>
Represents the completion of an asynchronous operation

A function whose declared type is neither 'void' nor 'any' must return a value.ts(2355)

what should I do to return the promise inside the chrome local storage get and make the code works?


Solution

  • To follow-up on my comment, you could do something like:

    api_post: async (url: string, data: any): Promise<T> => {
        const { result } = await chrome.storage.local.get("token");
        const response = await fetch(url, {
                method: 'POST',
                headers: {
                    'Content-type': 'application/json',
                    'x-access-token': result,
                },
                body: JSON.stringify(data),
            });
        return response;
    },
    

    Note: This is just to give you an idea of how you could refactor your method using async/await. This code will probably require some tweaking.