'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 1:[1]
I would use the Promise constructor. Then, resolve the final desired value in the chain, and reject any errors.
const api_post = <T>(url: string, data: any): Promise<T> => {
return new Promise((resolve, reject) => {
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) {
reject(new Error(response.statusText));
return;
}
resolve(response.json() as Promise<T>);
});
});
});
};
Solution 2:[2]
Just throwing in another snippet, since OP seem to dislike async/await from Ross Gatih' answer and I don't like the new Promise antipattern from Jordan Wrights answer
const api_post = <T>(url: string, data: any): Promise<T> => {
return chrome.storage.local.get("token")
.then((result: any) => 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();
});
};
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Jordan Wright |
| Solution 2 | Thomas |
