Node JS中事件的链接请求和数据

时间:2018-06-22 02:36:51

标签: javascript node.js http promise

我正在尝试将两个请求的响应合并为一个JSON 响应。该功能应该返回类型为[{response1JSON}, {response2JSON}]的数组,并且每个响应都会发送需要读取的数据流

function getSongs() {
    const page1 = 'url1'
    const page2 = 'url2'

    let resArray = await Promise.all([
         get(page1),
         get(page2)
      ])

     let flattenedResArray = [];

     resArray[0].on('response', (res) => {
       let body = ''
       res.on('data', chunk => {
       body += chunk;
  })

      res.on('end', () => {
         flattenedResArray.push(JSON.stringify(body));
       })
     })

     resArray[1].on('response', (res) => {
       let body = ''
       res.on('data', chunk => {
         body += chunk;
       })

      res.on('end', () => {
         flattenedResArray.push(JSON.stringify(body));
       })
     }) 
   return flattenedResArray;
}

flattenedResArray为空,因为它是异步填充的。我尝试过的失败

  • 将响应包装在新的Promise对象周围,然后进行then()
  • Promise.all(...).then(...).then(data)之后的跟踪响应

我正在寻找使用Promise.all合并这些响应的正确方法。

注意:两个URL都返回一个我们需要流式传输的大JSON文件。

2 个答案:

答案 0 :(得分:3)

您确实确实需要在两个请求的 promises 上调用Promise.all。如果您将最初的诺言链接在一起,那可能是最好的,这样就可以一次处理两个请求。由于res.on是基于回调的,而不是基于Promise的,因此您必须将其转换为Promise

const reqToPromiseOnEnd = req => new Promise(resolve => {
  req.on('response', (res) => {
    let body = ''
    res.on('data', chunk => {
      body += chunk;
    })
    res.on('end', () => {
      resolve(JSON.stringify(body));
    })
  })
});
function getSongs() {
  const page1 = 'url1';
  const page2 = 'url2';
  return Promise.all([
    get(page1).then(reqToPromiseOnEnd),
    get(page2).then(reqToPromiseOnEnd)
  ]);
}

// example:
getSongs().then(arr => console.log(arr));

答案 1 :(得分:0)

尝试一下

function send(page) {
    return new Promise((resolve) => {
        // Stream code
        req.on('response', (res) => {
            let body = ''
            res.on('data', chunk => {
                body += chunk;
            })
            res.on('end', () => {
                resolve(JSON.stringify(body));
            })
        })
    });
}

function getSongs() {
    const page1 = 'url1';
    const page2 = 'url2';
    return Promise.all([
        get(page1),
        get(page2)
    ]);
}
getSongs().then(arr => console.log(arr));

或您可以使用请求模块。 Check This

// npm install--save request
// npm install--save request-promise

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

function getSongs() {
    const page1 = 'url1';
    const page2 = 'url2';
    return Promise.all([
        rp(page1),
        rp(page2)
    ]);
}

getSongs().then(arr => console.log(arr));