Pesquisa de site

javascript - Como passar dados dos métodos "then" no CasperJS?


É comum ter múltiplos métodos then ao trabalhar com CasperJS. O seguinte é um exemplo:

casper.then(function(){
    var a = "test";
    // ...
})

casper.then(function(){
    // how to use the variable a in the first "then"
})

Minha pergunta é: qual é a maneira comum de passar valores de thens anteriores para thens seguintes? Para o exemplo mencionado, como usar a no segundo then?

Resposta #1

Existem muitas formas, mas a mais fácil seria usar variáveis globais. Se você não quiser poluir seus scripts com variáveis globais (o que não deveria ter a mesma preocupação que as variáveis globais no navegador, porque lá você poderia ter diferentes bibliotecas), você pode usar IIFEs para reduzir o escopo.

casper.start(url);
(function(casper){
    var a;
    casper.then(function(){
        // set a
    }).then(function(){
        // use a
    });
})(casper);
casper.run();

Outra versão da global é adicionar essas variáveis ao objeto casper.

Provavelmente a solução mais limpa seria aninhar aqueles blocos que precisam da variável. Você deve ter em mente que uma chamada de função síncrona não pode vir depois de uma assíncrona (todas essas são funções passo wait* e then*). Os passos programados são executados depois que o passo atual terminou:

casper.start(url).then(function(){
    var a; // set a somehow
    this.then(function(){
        // use a
    });
}).then(function(){
    // don't use a
}).run();