PhantomJS javascript等到功能完成

时间:2015-06-05 09:36:03

标签: javascript asynchronous phantomjs wait

我的PhantomJS脚本有问题。该脚本从网页获取JSON编码的字符串,并使用它执行其他操作。脚本:

\p{L}[\p{L}\p{D}]*

如何在前进之前检查changeAmount功能是否完成?超时是不可能的,因为我不知道处理changeAmount所需的时间。

2 个答案:

答案 0 :(得分:0)

您可以使用回调,如下所示:

function changeAmount(callback) {
    var page=require('webpage').create();
    page.open (address, function () {
        //parse json, set amount to something (usually 4)
        amount = 4;
        callback();
    });
}

changeAmount(function () {
    // This function runs when callback() (above) is reached
    console.log(amount);

    //Do stuff with amount

    phantom.exit();
});

如果您没有在其他地方使用amount变量,可以通过将其作为参数传递给回调来消除它:

changeAmount(function (amount) {

然后

callback(amount); // or callback(4);

答案 1 :(得分:0)

page.open()是一种固有的异步函数。唯一可行的方法是在PhantomJS脚本中使用回调:

var address = address;

function changeAmount(callback)
{
   var page = require('webpage').create();
   page.open (address, function(){
     //parse json, set amount to something (usually 4)
     var amount = 4;
     callback(amount);
  });
}

您甚至可以将amount传递给该回调以删除全局变量。

之后,您将需要使用该回调模式编写脚本。

changeAmount(function(amount){
    console.log(amount);

    //Do stuff with amount

    phantom.exit();
});

此外,每次拨打page时,您可能都不应该创建新的changeAmount()(如果您反复这样做)。您可以重复使用相同的page。如果您认为创建新页面为您提供了一个全新的工作环境,那么您就错了。它就像一个新标签。它将使用与您创建的所有其他页面相同的会话。

如果经常这样做,这会导致内存泄漏,因为您没有关闭之前打开的页面。