如何等待多次获取完成,聚合结果并将其发布到另一个URL



我正试图从多个URL中获取数据,例如,考虑a.com、b.com、c.com等。考虑到大约有500个这样的URL。其中一些是向上的,一些可能是向下的,这在运行时是未知的。我需要聚合从所有活动URL接收到的输出,并将它们发布到另一个URL。我是js的新手,无法用下面的代码完成聚合。请告诉我这里需要什么改变。

<script>
let resultVal="";
async function apiRequest(url) {
return new Promise(function (resolve, reject) {
fetch(url)
.then(function(response) {
if (!response.ok) {
throw new Error("HTTP error, status = " + response.status);
}
let myRet=response.text();
// resultVal=resultVal+"<br>"+url+" ::: "+myRet;
return myRet;
})
.then(function(text) {
resultVal=resultVal+"Url: "+url+"Inner content::: "+text+"<br>";
})
.catch(function(error) {
console.log("Error"+error); 
})
});
}
async function getData() {
let urlList = ["http://www.a.com", "http://www.b.com", "http://www.c.com"];
Promise.all(urlList.map(u=>apiRequest(u)))
.then(function(res){
console.log('Promise.all', res);
})
.catch(function(err){
console.error('err', err);
});
}
async function callFetch() {
const res= await getData();
}
callFetch();
fetch('http://www/xyz.com', {method: 'post', body: 'Response: '+resultVal});
</script>

代码中的问题如下

apiRequest:返回从未解析的new Promise

getData:不等待Promise.all解析

callFetch:异步,但调用时不等待

其他问题:

getDataasync-但你从来没有await
apiRequestasync-但你永远没有await
resultVal可以是";建造";按照任何顺序,这取决于回迁接收响应的顺序。

固定代码

async function apiRequest(url) {
const response = await fetch(url);
if (!response.ok) {
throw new Error("HTTP error, status = " + response.status);
}
let text = await response.text();
return "Url: " + url + "Inner content::: " + text + "<br>";
}
function getData() {
let urlList = ["http://www.a.com", "http://www.b.com", "http://www.c.com"];
return Promise.all(urlList.map(u => apiRequest(u)));
}
async function callFetch() {
let res = await getData();
return res.join('');
}
callFetch()
.then(resultVal => {
fetch('http://www/xyz.com', {
method: 'post',
body: 'Response: ' + resultVal
});
})
.catch(err => console.log('err', err));

在允许使用顶级await的浏览器中,callFetch函数之后的行也可以写入

try {
const resultVal = await callFetch();
await fetch('http://www/xyz.com', {
method: 'post',
body: 'Response: ' + resultVal
});
} catch(err) {
console.log('err', err);
}

但我暂时不使用它,或者如果代码正好在async函数中,就这样做

最新更新