将2个request.get函数合并为一个

时间:2018-01-26 19:28:42

标签: javascript node.js express

如何在1中合并这两个功能?有2个api-s:/ page1和/ page2。之后,我想将2个数组合并为一个。我这样做是因为github api在api中每页只显示100个对象。

request.get({
    url: 'https://api.github.com/users/angular/repos?per_page=100&page=1',
    json: true,
    headers: {'User-Agent': 'request'}
}, (err, res, data) => {
    if (err) {
        console.log('Error:', err);
    } else if (res.statusCode !== 200) {
    console.log('Status:', res.statusCode);
} else {

    console.log(data.length);

}

});

request.get({
    url: 'https://api.github.com/users/angular/repos?per_page=100&page=2',
    json: true,
    headers: {'User-Agent': 'request'}
}, (err, res, data2) => {
    if (err) {
        console.log('Error:', err);
    } else if (res.statusCode !== 200) {
    console.log('Status:', res.statusCode);
} else {
     });
    console.log(data2.length);

}

});

谢谢!

3 个答案:

答案 0 :(得分:1)

我会使用promises来跟踪两个请求何时完成,然后并行执行这两个请求(结果更快):

const rp = require('request-promise');

Promise.all([
    rp({
        url: 'https://api.github.com/users/angular/repos?per_page=100&page=1',
        json: true,
        headers: {'User-Agent': 'request'}
    }),
    rp({
        url: 'https://api.github.com/users/angular/repos?per_page=100&page=2',
        json: true,
        headers: {'User-Agent': 'request'}
    })
])).then(results => {
   let combined = results[0].concat(results[1]);
   // process combined results here
}).catch(err => {
    console.log(err);
});

请注意,request-promise库(它只是request库的包装器)会自动为您检查2xx状态,因此您不需要额外的代码。

答案 1 :(得分:0)

您可以在第一个请求完成后调用第二个请求,然后使用array.concat()方法合并两个结果:

request.get({
    url: 'https://api.github.com/users/angular/repos?per_page=100&page=1',
    json: true,
    headers: {'User-Agent': 'request'}
}, (err, res, data1) => {


    if (err) return console.log('Error:', err);

    if (res.statusCode !== 200) return console.log('Status:', res.statusCode);

    request.get({
        url: 'https://api.github.com/users/angular/repos?per_page=100&page=2',
        json: true,
        headers: {'User-Agent': 'request'}
    }, (err, res, data2) => {

        if (err) return console.log('Error:', err);

        if (res.statusCode !== 200) return console.log('Status:', res.statusCode);

        // merge 2 arrays:
        var data = data1.concat(data2);

    });

});

答案 2 :(得分:0)

您可以尝试async。它具有强大的流量控制能力。

以下代码是如何使用它来实现您的需求。 heretimes的文档。

async.times(2, (n, next) => {
  request.get({
    url: 'https://api.github.com/users/angular/repos?per_page=100&page=' + n,
    json: true,
    headers: {'User-Agent': 'request'}
  }, (err, res, data) => {
    next(err, data)
  })
}, (err, datas) => {
  // here datas contains data of two request
  // and you could handle err at one place
})

希望它有所帮助。