2016-05-21 5 views
3

Hier ist mein Code:Bluebird Promises returns "undefiniert", wenn Rückkehr nach innen "und dann" Funktion

prüft Benutzer offiziellen Twitter Account ist Folowing (hier habe ich neue Versprechen zurück

var isFollowing = function(sender) { 
    return new promise(function(resolve, reject) { 
     var following = false; 
     var params = { 
      source_id: sender, 
      target_screen_name: config.get('twitter.official_account') 
     }; 
     TwitObj.get('friendships/show', params, function(err, data) { 
      if (!err) { 
       following = data.relationship.source.following; 
       resolve(following); 
      } else { 
       reject(err); 
      } 
     }); 
    }); 
}; 

Validierung:

var validateMsg = function(dm) { 
    var sender = getSender(dm); 
    var result = []; 
    isFollowing(sender.id) 
     .then(function(response) { 
      if (!response) { 
       result = interactiveMessage(false, lang.__('FOLLOW_MAIN', sender.name)); 
       console.log(result); // Displays as expected 
       return result; // Not returning value Do I need to return promise again? If yes, WHY? 
      } 
     }); 
}; 

Haupt Umsetzung :

var direct_message = function(msg) { 
    verifyAccount().catch(function(err) { 
     console.error(err); 
    }); 
    var dm = msg.direct_message; 
    var result = validateMsg(dm); 

    console.log(result); 
}; 

Fragen ist, wie soll ich validateMsg Funktion zwingen result Variable innerhalb then Funktion zurückzukehren.

Update: Während des Debuggens, erfuhr ich, dass, console.log(response) in Validierungsfunktion in undefined werfen später nach anzeigt „dann“ Funktion, die Programmmittel nicht in der Lage ist Antwort zu erhalten sofort und aufgrund Asynchronität, E/A wird nicht blockiert. Wie dies anzugehen?

Antwort

3

Sie geben tatsächlich nichts in der validateMsg-Funktion zurück. Sie geben einen Synchronwert (result) in der Funktion .then zurück, die eine separate Funktion ist.

Die zweite Sache zu berücksichtigen ist, dass Sie die validateMsg-Funktion erwarten, die asynchron ist, um sich synchron zu verhalten.

var result = validateMsg(dm);

Die Art und Weise zu erreichen, was ich glaube, Sie suchen die folgenden Änderungen zu tun, beinhaltet das Herstellen: 1) in der validateMsg Funktion das Versprechen Kette zurück.

var validateMsg = function(dm) { 
    var sender = getSender(dm); 
    var result = []; 
    return isFollowing(sender.id) 
     .then(function(response) { 
      if (!response) { 
       result = interactiveMessage(false, lang.__('FOLLOW_MAIN', sender.name)); 
       return result; 
      } 
     // Not sure what you want to do here if there is a response! 
     // At the moment you're not doing anything if the validation 
     // is successful! 
     return response; 
    }); 

};

2) Ändern Sie Ihren Funktionsaufruf, da Sie jetzt ein Versprechen zurückgeben.

validateMsg(dm).then(function(result){ 
     console.log(result); 
    }) 

3) Betrachten Sie einen Fang irgendwo, wenn nur das Hinzufügen, Ihnen zu helfen debuggen :)

validateMsg(dm).then(function(result){ 
     console.log(result); 
    }) 
    .catch(function(err){ 
     console.log("Err:::", err); 
    }); 
+0

interessant aussieht. Ich glaube, ich habe dich verwirrt, indem ich all meinen Code zur Verfügung gestellt habe. Lassen Sie mich meine Frage überarbeiten und zu Ihnen zurückkommen :) Vielen Dank für Ihre Hilfe! –

+0

Keine Notwendigkeit !! Ihre Lösung Arbeitete wie Charme! Ich habe gerade ein weiteres Versprechen innerhalb der validateMsg-Funktion zurückgegeben. Danke für deine Bemühungen, Kumpel !!! –

+1

:) Ich empfehle ein wenig über einige vielversprechende Muster zu lesen. Ich empfehle diesen Artikel von @nolanlawson https://pouchdb.com/2015/05/18/we-have-a-problem-with-promises.html – leesio

0

Die Funktion validationMsg hat keinen Rückgabewert, daher hat das Ergebnis in der Hauptfunktion den Wert undefined. Versuchen Sie, die Rückgabe vor isFollowing zu setzen, damit die Funktion eine Zusage zurückgibt, und behandeln Sie dann validationMsg als eine Zusage.

Verwandte Themen