2016-03-21 7 views
0

ich Verständnis ein bisschen ein Problem habe, warum dies funktioniert:Wenn Versprechen Kette schlecht codiert, Code funktioniert

var userId; 
var token; 
var result = {}; 
var merchantId; 
userCtrl.loginUser(req.body.email, req.body.password).then(function(data) { 
      if (data.length == 1) { 
       userId = data[0].user_id; 
       return merchantCtrl.isMerchant(userId); 
      } else { 
       res.json({ 
        result: 2 
       }); 
      } 
     }).then(function(data) { 
      //If its merchant 
      if (data.length === 1) { 
       merchantId = data[0].merchant_id; 
       token = tokenUtil.createTokenMerchant(merchantId, userId); 
       result.token = token; 
       getFullUser(userId).then(function(userObject) { 
        result.user = userObject; 
        result.user.user_id = userId; 
        merchantCtrl.getMerchant(merchantId) 
         .then(function(data) { 
          result.merchant = data[0]; 
          res.json(result); 
         }); 
       }); 
      } else { 
       token = tokenUtil.createTokenUser(userId); 
       result.token = token; 
       return getFullUser(userId); 
      } 
     }).then(function(userObject) { 
      result.user = userObject; 
      result.user.user_id = userId; 
      res.json(result); 
     }) 

So wie Sie in diesem Code sehen kann sie die endgültigen Fangzustand und ein Semikolon fehlt . Aber das kompiliert gut und die Antwort ist genau.

Jetzt hier ist der interessante Teil: GetFullUser ist eine Funktion, die Versprechungen holt alle Benutzerinformationen (duh!) Und nach allen Versprechen löst es ein Objekt zurück, das diesen Benutzer enthält.

Beachten Sie, dass die Funktion getFullUser KEINE Versprechen zurückgibt.

Jetzt, nach diesen Fehlern zu sehen, habe ich den letzten Fang und das Semikolon:

var userId; 
     var token; 
     var result = {}; 
     var merchantId; 
     userCtrl.loginUser(req.body.email, req.body.password).then(function(data) { 
      if (data.length == 1) { 
       userId = data[0].user_id; 
       return merchantCtrl.isMerchant(userId); 
      } else { 
       res.json({ 
        result: 2 
       }); 
      } 
     }).then(function(data) { 
      //If its merchant 
      if (data.length === 1) { 
       merchantId = data[0].merchant_id; 
       token = tokenUtil.createTokenMerchant(merchantId, userId); 
       result.token = token; 
       getFullUser(userId).then(function(userObject) { 
        result.user = userObject; 
        result.user.user_id = userId; 
        merchantCtrl.getMerchant(merchantId) 
         .then(function(data) { 
          result.merchant = data[0]; 
          res.json(result); 
         }); 
       }); 
      } else { 
       token = tokenUtil.createTokenUser(userId); 
       result.token = token; 
       return getFullUser(userId); 
      } 
     }).then(function(userObject) { 
      result.user = userObject; 
      result.user.user_id = userId; 
      res.json(result); 
     }).catch(function(error) { 
      console.log("error: " + error.message + "; code: " + error); 
      res.status(500).json({ 
       message: "Error logging in." 
      }); 
     }); 

ich diese Fehlermeldung erhalten, wenn dieser ausgeführt wird:

error: Cannot set property 'user_id' of undefined; code: TypeError: Cannot set property 'user_id' of undefined 

Dies zeigt an, wann die user_id Zuordnung zu führen. Benutzer, Benutzer ist nicht definiert. Das bedeutet, da die Rückgabe auf dem getFullUser async ist, wartet der Code nicht auf seine Rückgabe und verwendet nur undefined.

Kann jemand erklären, warum das passiert?

Ich habe den Code bereits zu einer besseren Lösung geändert, aber ich frage mich, warum das passiert.

+1

Javascript wird automatisch das letzte Semikolon hinzufügen. Sie brauchen auch keinen Fang. 'getFullUser' glaubt definitiv, dass es ein Versprechen ist, sonst würde' .then() 'einen Fehler zurückgeben. Sind Sie sicher, dass etwas in 'getFullUser' kein Versprechen ist? – Wainage

+0

GetFullUser verwendet Versprechungen innerhalb, gibt aber ein einfaches Objekt zurück, nachdem sie die erforderlichen Daten aufgelöst und zurückgegeben haben. Warum sollte der Code nicht auf die getFullUser-Funktion warten, wenn ein Fang hinzugefügt wird? –

Antwort

0
  1. catch() im unteren Teil des Kette - ist nicht erforderlich, aber sehr zu empfehlen. Ohne Fang - Sie verloren Fehler können

  2. in dann() Block mit

    getFullUser (userId) .then (function (Benutzerobjekt) ...

Sie versprechen nennen, aber nicht Ergebnis zurück (nicht für Ergebnisse zu warten), deshalb auf nächsten Schritt, Sie ‚undefined‘ als param in nächsten Block erhalten

gesetzt

return getFullUser(userId).then(function(userObject) 
Verwandte Themen