Promise即使解决了,也会挂起
问题描述:
我正在使用request-promise
模块来检查网站是否正在使用代理。我试图找到代理速度足以在5秒内回答。因此,如果请求在5秒内没有超时,我只会添加对象。Promise即使解决了,也会挂起
对于某些代理,即使承诺解决,节点脚本暂停一段时间。我找不到延迟的原因。我看到它打印Done
但它挂起。 1分10秒后,脚本退出。这是由于我的代码挂起,或开放套接字等操作系统问题?
const rp = require('request-promise');
const testProxies = [
{
"ipAddress": "80.241.219.83",
"port": 3128,
},
{
"ipAddress": "45.55.27.246",
"port": 80
},
{
"ipAddress": "144.217.197.71",
"port": 8080,
},
{
"ipAddress": "104.131.168.255",
"port": 80,
},
];
function CheckSites(sitesArray,site) {
let ps = [];
for (let i = 0; i < sitesArray.length; i++) {
let proxy = sitesArray[i];
let ops = {
method: 'GET',
resolveWithFullResponse: true,
proxy: 'http://' + proxy.ipAddress + ':' + proxy.port,
uri:site,
};
let resp = rp.get(ops);
ps.push(resp);
}
return Promise.all(ps.map(function (p) {
p.time = Date.now();
return p
.then(function (a) {
return {'header':a.headers,'time':Date.now() - p.time};
})
.timeout(5000)
.catch(function (e) {
return {};
})
}))
}
CheckSites(testProxies,'https://www.example.com').then(function (object) {
console.log('Done!');
console.log(object);
}).catch(function (err) {
console.log('Exception: ' + err);
});
答
为您的使用情况下,我建议你使用它表现为Promise.all
的Promise.race()
但你只要最快的代理响应获取回调。
我已经调查更多的bug,它似乎是a request
module issue,当您使用超时,他们只是不关闭连接,它是在暂停状态
我收到'完成! '在控制台上。这意味着所有的承诺都得到解决。即使'Promise.race()'它仍然挂起一段时间然后脚本退出 – Meanteacher
@Meanteacher我更新我的答案似乎是请求模块错误,在超时https://github.com/request/request/issues/1676他们不关闭连接。 –
我检查了链接到另一个问题的链接。但是,该用户表示这是他的代码中的错误。我仍然不明白原因。不管怎么说,还是要谢谢你。 – Meanteacher