2013-09-29 6 views
0

Comment lier la portée de Google à la fonction fetch_page? Je dois être capable d'enchaîner les fonctions dans des chaînes de promesses puis de chaînes.Prototypes, portée et promesses

Google.prototype.search = function(keyword){ 
    this.keyword = keyword || this.keyword; 

    fetch_page().then(parse_page).then(function(){ 
     console.log('done'); 
    }); 
}); 

function fetch_page(){ 
    // I wants to access google's this.keyword 
} 

function parse_page(){ 
    // I also wants to access google's this.keyword 
} 

Des idées?

+1

Avez-vous essayé 'fetch_page.call (this) .alors (function (r) {console.log ("fait");})'? –

+0

C'est comment enchaîner la deuxième promesse avec l'appel. Cela ne déclencherait-il pas la fonction plutôt que de fournir la portée? – lededje

Répondre

3

Function#call peut être utilisé pour appeler fetch_page, en spécifiant la valeur à utiliser comme this: fetch_page.call(this).

Alors ES5 de Function#bind ou jQuery de $.proxy (je pense que vous utilisez jQuery, des promesses que vous utilisez, mais il est une estimation   — Mise à jour: Et je me suis trompé, mais je vais laisser l'info dans les personnes utilisant jQuery trouvent la réponse) pour créer une version liée de parse_page (c'est-à-dire, une fonction qui, lorsqu'elle est appelée, appellera parse_page avec une adresse spécifique this).

Function#bind:

Google.prototype.search = function(keyword){ 
    this.keyword = keyword || this.keyword; 

    fetch_page.call(this).then(parse_page.bind(this)).then(function(){ 
     console.log('done'); 
    }); 
}); 

Notez que Function#bind est de ES5, de sorte que vous aurez envie de vérifier que tous les navigateurs que vous voulez avoir. Si ce n'est pas le cas, c'est l'une des fonctionnalités ES5 qui peut être "calée" sur les anciens navigateurs; recherchez "ES5 shim" pour trouver plusieurs options.

jQuery de $.proxy:

Google.prototype.search = function(keyword){ 
    this.keyword = keyword || this.keyword; 

    fetch_page.call(this).then($.proxy(parse_page, this)).then(function(){ 
     console.log('done'); 
    }); 
}); 
+0

J'utilisais promise-io mais .bind a travaillé un régal. Merci de votre aide. – lededje

+0

Promise-io est nodejs côté serveur donc je suis tout bon :) – lededje

+0

@lededje: Ah, tout à fait si !! :-) –

-3

Vous aimez cette

var google = new Google(); // return the class instance 

google.keyword // get the public class variable called keyword 
2

Pour simplifier, je pencherais pour:

fetch_page(keyword).then(function() { 
    parse_page(keyword); 
}).then(function(){ 
    console.log('done'); 
}); 

puis ajoutez keyword à la liste des paramètres des deux fonctions externes.

Alternativement, il suffit de mettre en ligne les deux fonctions au sein de Google.prototype.search afin qu'ils partagent la même portée.

Une troisième approche consiste à .bind les fonctions de définir explicitement le contexte d'être votre objet this:

var fetch = fetch_page.bind(this); 
var parse = parse_page.bind(this); 

fetch().then(parse).then(...); 
+0

Je ne veux pas vraiment faire de bulles, mais toutes les fonctions ensuite ensuite. N'y a-t-il pas d'autre moyen de le lier? – lededje

+0

@lededje voir mise à jour ... – Alnitak

+0

Ceci est également correct, mais pas aussi complet que la réponse TJs. +1 cependant. – lededje