Phantomjs,Casperjs重要的概念:执行顺序

简介: <div class="markdown_views"><h2 id="phantomjscasperjs重要的概念执行顺序">Phantomjs,Casperjs重要的概念:执行顺序</h2><p>Phantomjs和Javascript一样,是基于消息驱动的。代码的执行都是异步化的。 <br>要理解phantomjs的代码执行是基于一个step栈。在执行脚本时,会将

Phantomjs,Casperjs重要的概念:执行顺序

Phantomjs和Javascript一样,是基于消息驱动的。代码的执行都是异步化的。
要理解phantomjs的代码执行是基于一个step栈。在执行脚本时,会将所有step压入栈。
wait,then,open,等这些都是一个step。
举几个例子:

casper.wait(1000,function() {
    do1
}
do2

do1和do2执行顺序是怎么样的?
wait方法是异步的!!!,do2会先执行!!!,为了让do1和do2顺序执行,必须这样:

casper.wait(1000,function() {
    do1
}
casper.then(function() {
    do2
}

wait方法先被压入step栈,然后then被压入栈。

讨论下then的用法

then() 方法将一个新的step压入栈,一个step是一个javascript的函数:
1. 等待前一个step完成后执行
2. 等待页面请求的url或其他page加载

来看一段代码:

var casper = require('casper').create();

casper.start();

casper.then(function step1() {
    this.echo('this is step one');
});

casper.then(function step2() {
    this.echo('this is step two');
});

casper.thenOpen('http://google.com/', function step3() {
    this.echo('this is step 3 (google.com is loaded)');
});

casper.run();

可以将steps栈打印出来方便调试:

require('utils').dump(casper.steps.map(function(step) {
    return step.toString();
}));

可以看到栈信息是这样的:

$ casperjs test-steps.js
[
    "function step1() { this.echo('this is step one'); }",
    "function step2() { this.echo('this is step two'); }",
    "function _step() { this.open(location, settings); }",
    "function step3() { this.echo('this is step 3 (google.com is loaded)'); }"
]

栈信息里,有一个_step(),这个是phantomjs自动帮我们加的,用于加载google.com这个url,然后step3才能执行。
栈里的step,必须在调用run后才真正开始执行。

递归的step

如果一个step内部有多个step,会怎么样?代码大概是这样:

casper.then(function() {
    casper.then(function() {
        do1
        casper.then(function() {
            do2
        })
        do3
    })
    do4
)

casper.then(function() {
    do5
})
一个step内部递归的step,在运行时,会动态压入所在step的内部栈。所以,执行顺序是:do4,do1,do3,do2,do4

非异步的方法

在sendAjax的时候,将asyn参数设为false,就可以正常执行,得到返回值result,否则是空

 var result = this.evaluate(function () {
    return __utils__.sendAJAX(url, 'GET', null, false,
        {
            contentType: 'application/x-www-form-urlencoded; charset=UTF-8'
        });
}, {url: url});

重大坑

exit()方法是异步的,也就是说,step1中调用exit,step2也有可能执行。

目录
相关文章
|
5月前
|
缓存 自然语言处理 前端开发
深入剖析JavaScript引擎的工作原理
【6月更文挑战第3天】JavaScript引擎由解析器、解释器、优化器和垃圾回收器组成,它们协同完成代码的解析、编译和执行。解析器将源代码转为抽象语法树(AST),编译阶段进行作用域分析和变量提升。解释器执行AST,优化器在代码频繁执行时进行即时编译以提高性能。垃圾回收器自动回收不再使用的内存,防止泄漏。理解这些原理有助于优化代码和提升Web应用性能。
55 1
|
6月前
|
JavaScript 前端开发
js开发:请解释同步和异步编程的区别。
同步编程按顺序执行,易阻塞;异步编程不阻塞,提高效率。同步适合简单操作,异步适合并发场景。示例展示了JavaScript中同步和异步函数的使用。
41 0
|
6月前
|
C#
C#学习系列相关之多线程(四)----async和await的用法
C#学习系列相关之多线程(四)----async和await的用法
|
Web App开发 缓存 JavaScript
带你读《现代Javascript高级教程》十、JavaScript引擎的工作原理:代码解析与执行(2)
带你读《现代Javascript高级教程》十、JavaScript引擎的工作原理:代码解析与执行(2)
|
Web App开发 自然语言处理 JavaScript
带你读《现代Javascript高级教程》十、JavaScript引擎的工作原理:代码解析与执行(1)
带你读《现代Javascript高级教程》十、JavaScript引擎的工作原理:代码解析与执行(1)
|
JavaScript 前端开发
浏览器中的事件循环和Node.js中事件循环的区别(经典面试题)
浏览器中的事件循环和Node.js中事件循环的区别(经典面试题)
766 0
|
JavaScript 前端开发 Unix
webpack原理篇(五十九):loader 的链式调用与执行顺序
webpack原理篇(五十九):loader 的链式调用与执行顺序
277 0
webpack原理篇(五十九):loader 的链式调用与执行顺序
|
JavaScript 前端开发 程序员
浏览器原理 06 # 变量提升:JavaScript代码是按顺序执行的吗?
浏览器原理 06 # 变量提升:JavaScript代码是按顺序执行的吗?
204 0
浏览器原理 06 # 变量提升:JavaScript代码是按顺序执行的吗?
|
测试技术 数据库 Python
python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)
大多数的初学者在使用 unittest 框架时候,不清楚用例的执行顺序到底是怎样的。对测试类里面的类和方法分不清楚,不知道什么时候执行,什么时候不执行。虽然或许通过代码实现了,也是稀里糊涂的一知半解,这样还好,好歹自己鼓 捣出了,但是时间和效率并不是很高,下次遇到还是老样子。那么本篇通过最简单案例来给给为小伙伴详细讲解、演示一下 unittest 执行顺序。
258 0
python接口自动化(二十二)--unittest执行顺序隐藏的坑(详解)