如何在PhantomJS中使用page.open之外的变量

时间:2014-09-18 15:08:55

标签: javascript phantomjs

我想要做的是访问page.open之外的一些变量,但它似乎不起作用。

我们来看看这段代码:

var page = require('webpage').create();
var url = 'http://www.bing.com';

var Tester;

page.open(url, function(status) {
    var cont = page.content;
    var patt = /Bing/;
    Tester = patt.test(cont);

    console.log ("Inside " + Tester);

    phantom.exit();
});

console.log ("Outside " + Tester);

输出结果为:

Outside undefined
Inside true

我希望这两个值都是真的,并且顺序是在第一个和第二个之后。 发生了什么事?

外部代码似乎在内部代码之前执行。

1 个答案:

答案 0 :(得分:0)

这是预期的行为,因为page.open是异步的。这意味着只要调用page.open,它就会打开指定的URL。这将花费一些时间,并且在加载页面并执行console.log ("Outside " + Tester);回调之前执行下一个语句(page.open)。

这是使用异步函数的正常JavaScript行为。如果你想在外面使用Tester,你需要等待一段时间,直到加载页面并执行回调。

例如这样,静态超时为3秒,并希望在那段时间内加载页面:

page.open(...);
setTimeout(function(){
    console.log ("Outside " + Tester);
}, 3000);

您可以增加超时时间以确保安全。

另一种可能性是使用waitFor from the examples并明确等待Tester设置:

page.open(...);
waitFor(function testFx(){
    return Tester;
}, function onReady(){
    console.log ("Outside " + Tester);
}, 10000); // something big, if it's ready earlier, then it is executed earlier