phantomjs-node page.evaulate似乎挂了

时间:2016-10-26 19:35:01

标签: node.js phantomjs

我有一个使用phantomjs-node的'waitfor'的实现,似乎sitepage.evaluate与它应该评估为true时相比有一个很大的滞后。您将在下面看到我正在注销内容值和内容日志,其中应该评估为true,但事实上这似乎不会在10秒左右发生。

知道会导致这种延迟的原因或是否有更好的评估方法?

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

1 个答案:

答案 0 :(得分:0)

据我所知,函数sitepage.evaluate返回Element。根据我的经验,这是个坏主意。你最好从sitepage.evaluate返回一个短字符串。例如,而不是返回document.getElementById('searchResult');你可以写:

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