Javascript 链接节点JS中事件的请求和数据
我试图将两个请求的响应合并为一个JSON 答复。函数应该返回类型为Javascript 链接节点JS中事件的请求和数据,javascript,node.js,http,promise,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) ])
[{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;
}
flattedResarray
为空,因为它是异步填充的。我尝试过但失败了的事情
- 围绕新的
对象包装响应并执行Promise
then()
- 在
Promise.all(…).then(…).then(data)
Promise.all
合并这些响应
注意:这两个URL都返回一个大的JSON文件,我们需要对其进行流式处理 您确实需要调用一个
承诺。所有的都基于两个请求的承诺。最好是把最初的承诺连成一个链条,这样就可以同时处理两个请求。因为res.on
是基于回调的,而不是基于承诺的,所以您必须将其转换为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));
您确实需要调用一个承诺。所有的都基于两个请求的承诺。最好是把最初的承诺连成一个链条,这样就可以同时处理两个请求。因为res.on
是基于回调的,而不是基于承诺的,所以您必须将其转换为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));
试试这个
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));
或者您可以使用请求模块进行操作。
试试这个
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));
或者您可以使用请求模块进行操作。
是否确实要将自己限制在两个硬编码URL?是否确实要将自己限制在两个硬编码URL?