等待PhantomJS脚本中的函数执行结束

时间:2015-05-14 20:28:33

标签: javascript function for-loop phantomjs wait

我正在开发一个小程序,它打开了大量的网页(根据从id.txt中获取的ID)并将其保存在文件中。

var page = require('webpage').create();
var fs = require('fs');
var file_h = fs.open('id.txt', 'r'); // contains data like : myName-1111
var line = file_h.readLine();

while(line) {
    data = line.split("-");
    line = file_h.readLine();
    savePage(data[1]);
}

function savePage(id){
    page.open('http://www.myWebsite.com/'+id, function(){
        page.evaluate();
        fs.write("page/"+id+'.html', page.content, 'w');
    });
}

file_h.close();
phantom.exit();

目前,我只保存这个html,head和body标签而没有任何内容。

我认为这是因为我不是在等待当前页面正确且完整地加载。

所以我想知道是否有解决方案在每个"之间等待"迭代以获得整个页面并能够保存它?

2 个答案:

答案 0 :(得分:1)

问题是循环执行是同步的,但page.open()函数中的savePage调用不是。执行循环时,页面未完全加载,因为打开了下一页打开。

您可能认为最后一页将完全加载,但事实并非如此,因为您使用phantom.exit()过早退出。

JavaScript没有睡眠功能。等待/休眠是异步完成的。解决这个问题的唯一方法是使用递归。

page.open()调用中移动while循环的内容并删除循环。然后调用该函数。您还需要将完成条件移至page.open()调用:

var page = require('webpage').create();
var fs = require('fs');
var file_h = fs.open('id.txt', 'r'); // contains data like : myName-1111

function traverse(){
    var line = file_h.readLine();
    if (!line) {
        file_h.close();
        phantom.exit();
    }
    page.open('http://www.myWebsite.com/'+id, function(){
        var data = line.split("-");
        traverse();
        fs.write("page/"+data[1]+'.html', page.content, 'w');
    });
}

traverse();

答案 1 :(得分:0)

最后,我写了一个正在运行的程序。

以下是代码:

var page = require('webpage').create();
var fs = require('fs');
var file_h = fs.open('id.txt', 'r');

var line = file_h.readLine();
data = line.split("-");
console.log("Reading id : "+data[1]);
savePage(data[1]);

function savePage(id){
    console.log("\n#### READING http://www.myWebsite.com/"+ id +" ####")
    page.open('http://www.myWebsite.com/'+id, function(){
        page.evaluate(function(){

        });
        console.log("#### WRITING "+ id +".html ####")
        fs.write("page/"+id+'.html', page.content, 'w');

        line = file_h.readLine();
        if(line == ""){
            phantom.exit();
        }
        data = line.split("-");
        savePage(data[1]);
    });
}

享受!