我有一个get请求,其中包含一个get请求循环。 它们传回我想要添加到数组的数据, 构建我的代码的最佳方法是什么,可能是承诺能够从循环内部传回值,当它们全部完成后能够console.log数据?
app.get('/outer', (res, req) => {
let url = 'https://samplejson.json';
https.get(url, (response) => {
response.on('data', (data) => {
let parsed = JSON.parse(data);
let collected = [];
parsed.forEach((myId) => {
let innerUrl = `https://samplejson/${innerId}.json`;
https.get(innerUrl, (innerResponse) => {
innerResponse.on('data', (innerData) => {
let parsedInner = JSON.parse(innerData);
//console.log(JSON.stringify(parsedInner,null,2));
let collect = parsedInner.title.trim().split(' ');
collect.forEach((w) => {
//console.log(w); // works
collected.push(w);
});
}, (err) => res.status(400).send(err));
} , (err) => res.status(400).send(err));
}, (err) => res.status(400).send(err));
console.log('ending'); // never shown ?
console.log(collected); // never shown ?
});
}, (err) => res.status(400).send(err));
}, (err) => {
res.status(400).send(err);
});
我的问题是收集的数组永远不会显示,我猜是因为请求永远不会发回数据?
那么分解我的代码并以正确的方式执行它的最佳方法是什么? 感谢
答案 0 :(得分:0)
您在上面发布的代码会在parsed.forEach()
中启动多个异步请求,但是控制台会在请求完成之前记录该数组。因此,没有数据可供显示。我在下面发布了一个建议的修补程序
使用request-promise
库使代码更具可读性。
app.get('/outer', (res, req) => {
return requestPromise({
url: 'https://samplejson.json',
method: 'GET',
json: true
})
.map((myId) => {
return requestPromise({
url: `https://samplejson/${myId}.json`,
method: 'GET',
json: true
})
.then((innerData) => {
return innerData.title.trim().split(' ');
});
})
.reduce((accumulated, current) => {
return accumulated.concat( current );
}, [])
.then((collected) => {
console.log("Collected into a flattened array:", collected);
})
.catch((error) => {
res.status(400).send(error);
});
});