我正在尝试在node.js应用程序中对外部URL进行远程调用,然后解析该请求并根据返回结果执行操作。我正在使用express和mysql。
我能够获取远程URL内容,但是,我处于某种竞争状态,我的输出总是在变化并且不可靠。我尝试使用async / await,但无法使用。
这是用来运行应用程序的函数:
function lista(servidores) {
return new Promise(function(resolve, reject) {
var sql = ' SELECT sv.id as svid, sv.ip as svip'+
' FROM servidores sv'
dbconfig.conexao.query(sql, function (err, result, fields) {
Promise.all(
result.map(row => {
var ipsv = row.svip;
var urlprobe = 'http://201.182.96.14:8000/PING/' + ipsv;
fetch(urlprobe, {
method: 'get',
headers: {
'Accept': 'application/json, application/xml, text/plain, text/html, *.*',
'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
},})
.then(
response => response.json(),
error => console.log('Ocorreu um erro', error)
)
.then(
json => console.log(json),
)
})
).then(result => result);
return resolve();
});
})
}
调用所有这些函数后,一切正常,直到monitora()函数为止。输出是随机的,基于该输出,取回的速度更快,因此结果不可靠。理想的是 monitora()分别执行每个提取,然后根据每个结果处理if。
@edit:我编辑了代码,并直接在main函数上进行了提取,但是我仍然收到不一致的结果,例如某处是否有某种缓存。
答案 0 :(得分:0)
我不确定我是否理解正确,但是您可以尝试使用Promise.all()
函数来等待所有提取请求完成,然后再执行操作。
Promise.all(
result.map(row => {
var urlMon = 'http://' + row.pip + ':8000/PING/' + ipsv;
monitora(urlMon, idsv);
})
).then(result => result /*Do something */);