0

我正在尝试使用soda.js创建一个 node.js 脚本来组织和编写Selenium脚本。我遇到的问题是我根本不了解soda.js链接哲学,特别是and()方法和文档在解释它是如何工作的方面非常薄弱。

想象以下测试用例:

var soda = require('soda');
var assert = require('assert');

var browser = soda.createClient({
    host: 'localhost',
    port: 4444,
    url: 'http://www.google.com',
    browser: 'firefox'
});

browser
    .chain
    .session()
    .open("http://www.google.com", function() {
        console.log("open complete");
    })
    .and(function() {
        console.log("and");
    })
    .and(function() {
        return function(browser) {
            console.log("and2");
        }
    }())
    .end(function() {
        console.log("end");
    })

我对链式 API 的理解是,它是为了防止回调地狱。因此,如果我调用 browser.method1().method2().method3()。然后method2将等待方法一。method3 将等待 method2() 等。为您提供同步的便利,但提供事件的功能。

我预计

open complete
and
and2
end

我明白了

and
and2
open complete
end

什么?它显然与and方法有关,我认为它是在声明你自己的任意函数,但它似乎没有遵循队列顺序。正如您在测试用例中看到的,我尝试了两种声明 and 函数的方法,一种使用自执行函数闭包,另一种使用标准匿名函数。两种情况下的结果相同。我如何让and()他们遵循队列顺序?

4

1 回答 1

0

经过一番敲打之后,我终于能够通过在 github 上翻阅 soda 的源代码来弄清楚这是如何工作的。基本上该.and()方法会立即触发。.end()每个链接的请求只是添加到一个队列中,并且在它遇到调用之前它不会开始处理队列。

这样,an 中的代码and()将始终在任何其他调用的回调之前处理。这种方式and()主要用于排队动态定义的动作,并且对于响应先前触发的动作没有用,这些应该在回调中完成。

于 2012-11-08T07:34:05.393 回答