节点多个get请求循环传递到数组

时间:2017-01-29 19:55:58

标签: javascript node.js promise

我有一个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);
});

我的问题是收集的数组永远不会显示,我猜是因为请求永远不会发回数据?

那么分解我的代码并以正确的方式执行它的最佳方法是什么? 感谢

1 个答案:

答案 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);
    });
});