我正在接收以逗号分隔的查询中的一些动物的名称。现在我必须调用一次只接受一个动物名称的API。我想为每个动物调用一次相同的API,并在响应客户端之前将json数据推送到数组中。
在测试时,我在客户端上得到一个空数组,据我的理解,这是因为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);
});
async
函数返回一个promise。你想保存所有的承诺,当所有的承诺都解决了,你想继续。
您可以等待Promise.all
的所有承诺。
我使用map
而不是forEach
来映射所有数组值到承诺。
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);
});