Reputation: 27
Im having trouble combining two async variables into one array:
My code:
async function fetchMenus ({actions, state}) {
return actions.theme.fetchToken().then(async () => {
const items = await fetch("url", {
method: "GET",
headers: {
Authorization: `Bearer ${state.theme.token}`,
},
});
const menu = await fetch("url", {
method: "GET",
headers: {
Authorization: `Bearer ${state.theme.token}`,
},
});
return [menu.json(), items.json()];
});
};
As a response i recieve 2 fulfilled promises, but i want to receive the results. How can i solve this?
Upvotes: 0
Views: 1647
Reputation: 14904
There are mistakes for example .json()
is async too.
Also using Promise.all()
is a bit faster because your API calls doesnt seem to depend on eatch other.
Because you return an array you can directly write return await Promise.all(menu.json(), items.json())
because Promise all returns an array
async function fetchMenus({ actions, state }) {
let token = await actions.theme.fetchToken();
let [items, menu] = await Promise.all(
fetch("url", {
method: "GET",
headers: {
Authorization: `Bearer ${state.theme.token}`
}
}),
fetch("url", {
method: "GET",
headers: {
Authorization: `Bearer ${state.theme.token}`
}
})
);
return await Promise.all(menu.json(), items.json());
}
Upvotes: 2
Reputation: 103
You just need to await your response json.
async function fetchMenus ({actions, state}) {
return actions.theme.fetchToken().then(async () => {
const items = await fetch("url", {
method: "GET",
headers: {
Authorization: `Bearer ${state.theme.token}`,
},
});
const menu = await fetch("url", {
method: "GET",
headers: {
Authorization: `Bearer ${state.theme.token}`,
},
});
const itemsJson = await items.json();
const menuJson = await menu.json();
return [menuJson, itemsJson];
});
};
Edit: I agree with other posters about using Promise.all as well.
Upvotes: 3
Reputation: 2347
You can do
Promise.all(fetchMenus(parameters).result).then((results) => {
... work with results
});
Promise.all puts an array of promises into a new promise, so to say.
It is typically used after having started multiple asynchronous tasks to run concurrently and having created promises for their results, so that one can wait for all the tasks being finished.
Upvotes: 1