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.
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
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? –