Как работает API цепочки soda.js для сайтов тестирования селена с использованием node.js

Я пытаюсь создать скрипт node.js, используя soda.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(). Затем метод2 будет ждать метода один. method3 будет ждать method2() и т. д. Дает вам простоту синхронного, но функциональность событийного.

Я жду

open complete
and
and2
end

я получил

and
and2
open complete
end

Какой? Это явно имеет какое-то отношение к методу and, который, как я думал, объявлял ваши собственные произвольные функции, но, похоже, он не следует порядку очереди. Как вы можете видеть в тестовом примере, я пробовал два метода объявления функции and, один с использованием замыкания самовыполняющейся функции, а другой со стандартной анонимной функцией. Одинаковый результат в обоих случаях. Как заставить and() следовать порядку очереди?


person Nucleon    schedule 02.11.2012    source источник


Ответы (1)


После долгих головоломок я, наконец, смог понять, как это работает, только загрузив исходный код газировки на github. В основном метод .and() срабатывает немедленно. Каждый связанный запрос просто добавляется в очередь и не начинает обработку очереди, пока не встретит вызов .end().

Таким образом, код внутри and() всегда будет обрабатываться перед обратным вызовом из любого другого вызова. Таким образом, and() в основном используется для постановки в очередь динамически определенных действий, и он бесполезен для ответа на ранее запущенные действия, вместо этого их следует выполнять в обратных вызовах.

person Nucleon    schedule 08.11.2012
comment
пожалуйста, помогите мне на каком-нибудь примере для обратного вызова означает, что делать. У меня есть сообщение о проблеме stackoverflow.com/questions/16261010/ - person Dev G; 30.04.2013