2017-08-25 49 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

相關問題