簡體   English   中英

PhantomJS javascript等到功能完成

[英]PhantomJS javascript wait until function complete

我的PhantomJS腳本有問題。 該腳本從網頁獲取JSON編碼的字符串,並執行其他操作。 劇本:

var address = address;
var amount = 0;

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

changeAmount();
console.log(amount); //prints 0

//Do stuff with amount

phantom.exit(); //amount not changed yet.

如何在前進之前檢查changeAmount函數是否完成? 無法超時,因為我不知道處理changeAmount所花費的時間。

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

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

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

此外,您可能不應該在每次調用changeAmount()都創建一個新page (如果重復執行此操作)。 您可以重復使用同一page 如果您認為創建新頁面為您提供了一個全新的工作環境,那么您就錯了。 就像一個新標簽一樣。 它將使用與您創建的所有其他頁面相同的會話。

如果您經常執行此操作,則會導致內存泄漏,因為您沒有關閉以前打開的頁面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM