概念:
所有的Phantomjs代码执行都是基于一个step栈,在执行脚本的时候,会将所有的step压入栈
例子:
phantom.outputEncoding = "GBK"
var casper = require('casper').create();
casper.start(function()
{
this.echo("入口");
})
casper.wait(1000,function()
{
this.echo("数字1");//do 1
})
casper.echo("数字2");//do 2
casper.run();
输出结果:
数字2
数字1
由于wait()方法是异步的,所以do2会先执行,do1等1秒后运行,如果想让do1和do2按顺序执行,必须修改方式为用than函数
casper.then(function()
{
this.echo("数字2");
});
完整代码:
phantom.outputEncoding = "GBK"
var casper = require('casper').create();
casper.start(function()
{
this.echo("入口");
})
casper.wait(1000,function()
{
this.echo("数字1");
})
casper.then(function()
{
this.echo("数字2");
});
casper.run();
输出结果:
数字1
数字2
wait方法会先被压入栈,然后then压入栈,than()方法将一个新的step压入栈,一个step是一个js函数
打印堆栈信息:
require('utils').dump(casper.steps.map(function(step) {
return step.toString();
}));
例子2:
phantom.outputEncoding = "GBK";
var casper = require('casper').create();
casper.start();//入口
casper.then(function step1()
{
this.echo("this is step 1");
});
casper.then(function step2()
{
this.echo("this is step 2");
})
casper.thenOpen("http://www.baidu.com",function step3()
{
this.echo ("this is step 3 (baidu.com is loaded)");
})
casper.run()
//打印栈信息
require('utils').dump(casper.steps.map(function(step) {
return step.toString();
}));
输出结果:
_step()函数是Phantomjs自动添加进去 ,用于加载baidu.com这个url,然后step3才能执行,栈中的step必须调用run后才会执行
例子3:
phantom.outputEncoding = "GBK";
var casper = require('casper').create();
casper.start();
casper.then(function() //第一层
{
this.echo ("do1");
casper.then(function() //第二层
{
this.echo("do2");
casper.then(function()//第三层
{
this.echo("do3");
})
this.echo ("do4");
})
this.echo ("do5");
})
require('utils').dump(casper.steps.map(function(step) {
return step.toString();
}));
casper.run();
其实很简单,我也很爱你
运行顺序:
第一层,第二层,第三层
这个例子是我师父@梵心给我讲的,大概的意思我是懂了,让我不要这样写代码,不然就打死我 emmmmmmmmmm