2012-10-31 2 views
1

j'ai le code suivant:coffeescript champs variables sur la fonction de rappel node_redis

genUserLeagueDiscussionTable = (userLeagueId, firstEntry, displayEntries) -> 
    # Generate League Discussion 
    leagueDiscussionTable = 
    striped: yes 
    bordered: yes 
    hover:  no 
    condensed: yes 
    columns: [{head:"Name"}, {head:"Comments"}] 

    console.log "get userLeague #{userLeagueId}" 
    LeagueId = userLeagueId 

    getLeagueDiscussionEntries = (entry, callback) => 
    getDiscussionEntry = (err,cnreply) -> 
     setDiscussionTableRows = (err,replyObj,request) -> 
     leagueDiscussionTable.rows[entry.dataentrynum].data = [replyObj.nickname,cnReply.entryText] 
     console.log "Reply received for entry ",entry.entrynum 
     console.log cnreply.entryText 
     loginclient.hgetall 'uid:'+cnReply.postingUid, setDiscussionTableRows 
     callback() 
    lookupentry = entry.lookupentry 
    console.log "getting entry for ", entry, " database key ", lookupentry 
    leagueclient.hgetall lookupentry, getDiscussionEntry 
    getLeagueInfo = (err,lreplyObj) => 
    console.log "got league info", lreplyObj 
    leagueDiscussionTable.caption = lreplyObj.leagueName+" League Info" 
    console.log "caption", leagueDiscussionTable.caption 
    leagueDiscussionEntries = lreplyObj.currentDiscussionEntry 
    console.log "Caption ",leagueDiscussionTable.caption," entries ", leagueDiscussionEntries, " Display Entries ",displayEntries 
    lastEntry = Math.min(leagueDiscussionEntries,firstEntry+displayEntries) 
    console.log "start entry ", firstEntry, " last entry ", lastEntry 
    entries=[] 
    for num in [firstEntry..lastEntry] 
     console.log num,".a" 
     entries[num]={} 
     entries[num].entrynum=num 
     console.log num,".b" 
     entries[num].lookupentry="userLeagueId:#{LeagueID}:discussionEntryId:#{entry}" 
     console.log num,".c" 
     entries[num].dataentrynum = num-firstEntry 
     console.log num," ", entries[num] 
    console.log "Lookup the entries ", entries 
    async.forEach entries, getLeagueDiscussionEntries 
    , (err,reply) -> 
     console.log "callback 1" 
    leagueclient.hgetall "userLeagueId:#{LeagueId}", getLeagueInfo 
    return leagueDiscussionTable 

Peu importe ce que je fais, je ne peux pas accéder ou userLeagueId dans de ligue getLeagueInfo. Cela fonctionne bien dans le wrapper externe, mais je ne peux pas y accéder à l'intérieur de la fonction de rappel.

Qu'est-ce que je fais mal?

Merci pour l'aide. [Edit] Y at-il un moyen pour moi de passer cela en tant que paramètre à la fonction via l'appel hgetall au rappel?

Fred

Répondre

0

Votre code a beaucoup de dépendances il est donc difficile de comprendre l'isolement, mais je suggère de changer LeagueId à une variable d'instance:

`@leagueId = userLeagueId` 

puis référence @leagueId à la place à l'intérieur getLeagueInfo.

+0

Alors ça a marché, mais je ne sais pas pourquoi. Quelqu'un at-il de bons conseils pour une leçon en ligne qui m'aide à savoir où je devrais utiliser les références @ (this) à ce genre de choses? –

+0

Dans votre exemple, vous définissez 'genUserLeagueDiscussionTable' comme un objet avec' getLeagueInfo' comme méthode. Vous passez 'getLeagueInfo' en guise de rappel pour' hgetall', mais quand il est rappelé, la portée où 'LeagueId' a été créé n'est plus disponible. Passer à '@ leagueId' en fait une propriété de' genUserLeagueDiscussionTable', accessible via 'this' quand vous êtes dans' getLeagueInfo', ce qui pointe vers le bon 'car' car vous avez utilisé le symbole' => 'pour le définir. Utilisez '@' lorsque vous utilisez des rappels pour stocker des variables d'instance pour l'accès dans les rappels. –

Questions connexes