我正在尝试将两个请求的响应合并为一个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文件。
答案 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));