2016-02-05 1 views
3

J'utilise une promesse chaînée en JavaScript (je pense). Il y a une fonction then() dans la chaîne. Je veux accéder à la variable dans la promesse, ou renvoyer la variable via mon objet de réponse HTTP.Accéder aux variables à l'intérieur d'une chaîne de promesses Javascript

var getTitle = function(response) 
{ 
    console.log("Starting getTitle. response: " + response); //this works 

    var horseman = new Horseman();   // object for headless browser 

    horseman 
     .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0") 
     .open('http://www.google.com/ncr') 
     .type('input[name="q"]', 'github') 
     .click("button:contains('Google Search')") 
     .keyboardEvent("keypress",16777221) // press Enter 
     .waitForSelector("div.g")   
     .title()   // gets the title of the page 
     .then(function(t) { 
      console.log("title: " + t);  // this works 
     }) 
     .close(); 

    console.log("title outside: " + t);  // this gives 'undefined' 

    return t;   // returns 'undefined' 
} 

Comment puis-je extraire la variable 't'? J'ai également essayé de passer 'réponse' dans la fonction comme

.then(function(t, response) { 

Mais quand je connecte 'réponse', il est indéfini. Si je pouvais transmettre l'objet réponse d'une manière ou d'une autre, cela fonctionnerait aussi.

Si je

var test = horseman... 

test devient un objet de promesse, mais il ne contient pas la variable t.

+0

Je ne suis pas sûr de ce que vous essayez d'accomplir, Vous dites que le titre est à juste titre disponible dans la fonction .then. Essayez-vous de renvoyer cela à l'appelant de la fonction? –

+0

Oui. Eh bien, le but est d'avoir 'response' et' t' accessibles dans la même portée. – user3320795

Répondre

1

Essayez de revenir d'un .finally().

.finally(function(t){ 
     return t; 
    }); 
+0

Bingo! Merci James. Code de travail ci-dessous. – user3320795

0

Vous cann't return t de la fonction getTitle, mais vous avez 2 options ici.

1.To faire tout ce que vous avez besoin avec t dans la fonction de rappel dans then, ou passer la fonction de rappel comme paramètre

var getTitle = function(response, callback) { 
... 
.then(function(t) { 
    callback(t); 
}); 

2.To promesse de retour de getTitle et utiliser then pour gérer la réponse.

return horseman; 
... 
var t = getTitle(response); 
t.then(function(t){/* handle t */}); 
+0

Merci. Comment puis-je obtenir l'objet 'response' dans callback()? Vous passez – user3320795

+0

fonction de rappel en tant que paramètre à la fonction getTitle, à l'intérieur de celui-ci, vous pouvez passer t et la réponse à si vous avez besoin. rappel (t, réponse). –

1

Cela fait:

var getTitle = function(response) 
{ 
    console.log("Starting getTitle. response: " + response); //this works 

    var horseman = new Horseman();   // object for headless browser 

    var xyz = horseman 
     .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0") 
     .open('http://www.google.com/ncr') 
     .type('input[name="q"]', 'github') 
     .click("button:contains('Google Search')") 
     .keyboardEvent("keypress",16777221) // press Enter 
     .waitForSelector("div.g")   
     .title()   // gets the title of the page 
     .finally(function (t) { 
      horseman.close(); 
      return t; 
     }); 

    return xyz;   
} 

Dans la fonction appelante:

var abc = getTitle(response); 
abc.then(function(abc) { 
    console.log("abc: " + abc); 
    response.writeHead(200, {'Content-Type': 'text/html'}); 
    response.end(abc); 

Il n'a pas fonctionné si je mets des plus de lignes de code à l'intérieur du bloc finally; Je ne sais pas pourquoi. Je peux probablement supprimer le paramètre response; besoin de tester cela.