2017-08-25 2 views
5

J'utilise le module request-promise pour vérifier si le site fonctionne avec un proxy ou non. J'essaie de trouver les procurations qui sont assez rapides pour répondre en 5 secondes. Par conséquent, je n'ajoute de l'objet que si la requête ne dépasse pas le délai de 5 secondes.La promesse se bloque même si elle est résolue

Pour certains proxies, même si la promesse se résout, le script de noeud se bloque pendant un certain temps. Je ne peux pas trouver la raison de ce retard. Je vois qu'il imprime Done mais il se bloque. Après 1 minute 10 secondes plus tard, le script se termine. Est-ce que c'est dû à mon code, ou au problème du système d'exploitation pour les sockets ouverts, etc?

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); 
}); 

Répondre

1

Pour votre cas d'utilisation, je vous suggère d'utiliser le Promise.race() il se comporte comme Promise.all mais vous obtenez le rappel dès que le proxy répond le plus rapide.

J'ai étudié plus sur le bug, et il semble être a request module issue, lorsque vous utilisez délai d'attente, ils ne ferment pas la connexion et il est dans un état raccrochage

+0

Je reçois 'fait! 'sur la console. Cela signifie que toutes les promesses sont résolues. Même avec 'Promise.race()' il se bloque encore pendant un certain temps puis le script sort – Meanteacher

+0

@Meanteacher J'ai mis à jour ma réponse semble être bug de module de demande, sur le délai d'attente https://github.com/request/request/issues/1676 ils ne ferment pas la connexion. –

+0

J'ai vérifié votre lien qui lie à un autre problème. Cependant, cet utilisateur dit que c'était une erreur sur son code. Je ne peux toujours pas comprendre la raison. Merci quand même. – Meanteacher