2017-08-25 108 views
5

我正在使用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); 
}); 

回答

1

为您的使用情况下,我建议你使用它表现为Promise.allPromise.race()但你只要最快的代理响应获取回调。

我已经调查更多的bug,它似乎是a request module issue,当您使用超时,他们只是不关闭连接,它是在暂停状态

+0

我收到'完成! '在控制台上。这意味着所有的承诺都得到解决。即使'Promise.race()'它仍然挂起一段时间然后脚本退出 – Meanteacher

+0

@Meanteacher我更新我的答案似乎是请求模块错误,在超时https://github.com/request/request/issues/1676他们不关闭连接。 –

+0

我检查了链接到另一个问题的链接。但是,该用户表示这是他的代码中的错误。我仍然不明白原因。不管怎么说,还是要谢谢你。 – Meanteacher

相关问题