2017-12-14 4 views
2

Ich versuche, eine Textnachricht zu senden, wenn ein Benutzer das Zurücksetzen seines Kennworts anfordert. Ich würde gerne darauf warten, dass die Nachricht gesendet wird, um den Benutzer zu warnen, wenn es erfolgreich war oder nicht. Ich versuche zur Zeit, es zu tun, wie folgt:Warten Sie, bis AWS SNS publish callback einen Wert an die aufrufende Methode zurückgibt

async function sendResetPasswordTextMessage(req, res) { 
    let result = {}; 

    let phoneNumber = req.body.phoneNumber;     

    if (phoneNumber === undefined) {      
     return sendInvalidParametersMessage(res);   
    }              

    phoneNumber = phoneNumber.toString();     

    const userProfile = await models.UserProfile.findOne({ 
     where: {           
      phoneNumber: phoneNumber      
     }             
    });              
    ************************** RELEVANT CODE TO ISSUE ************************* 
    if (userProfile) { 
     const message = "Your username is:\n" + userProfile.username; 
     const sent = await AWSSNSClient.sendMessage(message, phoneNumber); 

     if (!sent) { 
      result.error = setTitleAndMessage("Error", "An error occurred"); 
     } else { 
      result.success = setTitleAndMessage("Success", "Message sent"); 
     } 
    } 
    return res.send(result); 
    *************************************************************************** 
} 

In meiner anderen Klasse AWSSNSClient, habe ich folgende Sendmessage-Funktion:

function sendMessage(message, phoneNumber) { 
    const params = { 
     Message: message, 
     MessageStructure: "string", 
     PhoneNumber: "+1" + phoneNumber 
    }; 
    let sent = false; 
    sns.publish(params, function(err, data) { 
     if (err) { 
      console.log(err, err.stack); // an error occurred 
     } 
     else { 
      sent = true; 
     } 
    }); 

    return sent; 
} 

Ich kann nicht herausfinden, wie nachrichts Warten auf sns.publish machen zurückkommen, bevor es sich selbst zurückgibt. Ich habe versucht, es zu einer asynchronen Methode zu machen und auf sns.publish zu warten, aber die Funktion kehrt immer noch zurück, bevor send auf true gesetzt wird.

Ich weiß, dass die Nachrichten ohne Fehler senden, weil ich sie erhalte und keine Konsolenprotokolle gedruckt werden.

+2

Wie bei anderen asynchronen Dinge in Javascript liefern können, müssen Sie entweder eine Callback-Funktion nachrichts denen kann anrufen Bei Erfolg oder Fehler oder Rückgabe eines Versprechens, das bei Erfolg oder Fehler behebt/ablehnt. –

Antwort

2

Sie können einfach Callbacks dafür verwenden. Ändern Sie bitte Ihre sendMessge wie diese

function sendMessage(message, phoneNumber, cb) { 
    const params = { 
     Message: message, 
     MessageStructure: "string", 
     PhoneNumber: "+1" + phoneNumber 
    }; 
    sns.publish(params, cb); 
} 

dann auf Ihre Hauptdatei Sie callback wie diese

if (userProfile) { 
    const message = "Your username is:\n" + userProfile.username; 
    AWSSNSClient.sendMessage(message, phoneNumber, (err, data) => { 
    if (err) { 
     result.error = setTitleAndMessage("Error", "An error occurred"); 
    } 
    else { 
     result.success = setTitleAndMessage("Success", "Message sent"); 
    } 
    res.send(result); 
    }); 
} 
+0

In der Funktion sendMessage wurde die Zeile "let sent = false;" muss da nicht mehr korrekt sein? – havak5

+0

Ja, Sie können diese Variable entfernen, da sie nicht mehr verwendet wird. –

+0

Bearbeitete die Antwort und entfernte die Variable "send". –