#javascript #node.js #express #async-await #fetch
Вопрос:
Я получаю имена нескольких животных в запросе, разделенные запятыми. Теперь мне нужно вызвать API, который принимает только одно имя животного за раз. Я хочу вызвать один и тот же API один раз для каждого животного и поместить jsonified данные в массив, прежде чем отвечать своему клиенту.
Я получаю пустой массив на своем клиенте во время тестирования, и, насколько я понимаю, это происходит потому, что res.send() выполняется, пока обещание ожидает разрешения.
Приветствуется любое решение.
router.get('/animals', async (req, res) => {
const mammalsArray = req.query.mammals.split(',');
let final = [];
await mammalsArray.forEach(async function(mammal) {
const response = await fetch(`https://someapi.com/pedia?tag=${mammal}`);
const json = await response.json();
final.push(json);
});
res.send(final);
});
Комментарии:
1.
forEach
ничего не возвращает.
Ответ №1:
async
функция возвращает обещание. Вы хотите сохранить все обещания, и когда все обещания будут выполнены, вы хотите продолжить.
Вы можете дождаться всех обещаний с Promise.all
помощью .
Я использовал map
вместо forEach
того, чтобы сопоставлять все значения массива с promises.
router.get('/animals', async(req, res) => {
const mammalsArray = req.query.mammals.split(',');
let final = [];
let promisesArray = mammalsArray.map(async function(mammal) {
const response = await fetch(`https://someapi.com/pedia?tag=${mammal}`);
const json = await response.json();
final.push(json);
});
await Promise.all(promisesArray);
res.send(final);
});
Комментарии:
1. Спасибо за решение. Это помогло мне.