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?
CodePudding user response:
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>);
});
});
});
};
CodePudding user response:
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.
CodePudding user response:
You are not returning anything within your method right now. You are just calling chrome.storage.local.get
function. Notice that returning from then
block or inside function (result:any) {...}
function does not return from the whole method. Working example can look like this:
const api_post = <T>(url: string, data: any): Promise<T> => {
let token: string = '';
chrome.storage.local.get("token", (result:any) => {
token = result;
});
return fetch(url, {
method: 'POST',
headers: {
'Content-type': 'application/json',
'x-access-token': token,
},
body: JSON.stringify(data),
}).then(response => {
if (!response.ok) {
throw new Error(response.statusText);
}
return response.json() as Promise<T>;
});
}