2016-10-26 2 views
0

Ich habe eine Implementierung von 'Waitfor' mit Phantomjs-Knoten und es scheint, dass die sitepage.evaluate hat eine große Verzögerung im Vergleich zu, wenn es richtig bewerten sollte. Sie werden unten sehen, dass ich den Inhaltswert und die Inhaltsprotokolle mit dem auslogge, was als wahr bewertet werden sollte, aber das scheint nach gut 10 Sekunden nicht mehr aufzutreten.Phantomjs-Knoten page.evaculate scheint zu hängen

Irgendeine Idee, was diese Verzögerung verursachen würde, oder wenn es eine bessere Weise gibt, auszuwerten?

let Promise = require('bluebird'); 
let phantom = require('phantom'); 
let sitepage; 
let phInstance; 

phantom.create() 
    .then(instance => { 
     phInstance = instance; 
     return instance.createPage(); 
    }) 
    .then(page => { 
     sitepage = page; 
     return page.open('https://thepiratebay.org/search/game/0/99/0'); 
    }) 
    .then(status => { 

     return waitUntil(function() { 

      //This returns the correct content after a short period, while the evaluate ends up taking maybe 10s longer, after this content should evaluate true. 
      sitepage.property('content').then(content => { 
      console.log(content); 
      }); 

      return sitepage.evaluate(function() { 
       return document.getElementById('searchResult'); 
      }); 

     }).then(function() { 
      return sitepage.property('content'); 
     }).catch(Promise.TimeoutError, function(e) { 
      sitepage.close(); 
      phInstance.exit(); 
     }); 

    }) 
    .then(content => { 
     console.log('content'); 
     console.log(content); 
     sitepage.close(); 
     phInstance.exit(); 
    }) 
    .catch(error => { 
     console.log(error); 
     phInstance.exit(); 
    }); 


var waitUntil = (asyncTest) => { 
    return new Promise(function(resolve, reject) { 
     function wait() { 
      console.log('--waiting--'); 
      asyncTest().then(function(value) { 
       if (value) { 
        console.log('resolve'); 
        resolve(); 
       } else { 
        setTimeout(wait, 500); 
       } 
      }).catch(function(e) { 
       console.log('Error found. Rejecting.', e); 
       reject(); 
      }); 
     } 
     wait(); 
    }); 
} 

Antwort

0

Soweit ich sehe, gibt die Funktion sitepage.evaluate Element zurück. Meiner Erfahrung nach ist das eine schlechte Idee. Sie sollten eine kurze Zeichenfolge von siteepage.evaluate zurückgeben. Zum Beispiel anstelle von return document.getElementById ('searchResult'); Sie könnten schreiben:

return document.getElementById('searchResult') ? 'true' : ''; 
Verwandte Themen