Unten sehen Sie, wo ich ein Problem im kommentierten Code habe. Ich habe ein verschachteltes Versprechen, das ein Objekt in einer Sammlung erstellt und dann zurückgibt.Verschachtelte Versprechen können nicht zur nächsten Versprechenskette zurückgegeben werden
Aber ich denke, ich habe ein Problem mit Async. Die Funktion wird abgeschlossen, bevor das erstellte Objekt vom verschachtelten Versprechen zurückgegeben wird.
Ich fasse immer noch Versprechen Verkettung, und ich mache wahrscheinlich viel falsch hier. Vieles davon könnte aufgeklärt werden, wenn ich etwas davon reinigen/reduzieren könnte.
PostSchema.statics.createPost = function (o, user) {
var whiskey;
return Whiskey
.createWhiskey(o.whiskey.value)
.then(function (whiskeyData) {
whiskey = whiskeyData.whiskey;
o.post.whiskey = whiskeyData.whiskey._id;
if (whiskeyData.whiskey.distiller) {
o.post.distiller = whiskeyData.whiskey.distiller;
}
return o.distiller.new === true && !whiskey.distiller ? Distiller.newDistiller(o.distiller.value) : Promise.resolve()
.then(function (distiller) {
//this never invokes <---- it's called from the function below
console.log('never invokes', distiller).
if (distiller) {
whiskey.distiller = distiller._id;
//test this save
whiskey.save();
o.post.distiller = distiller._id;
}
var post = o.post;
post.user = user._id;
return Post
.createAsync(post)
.then(function (data) {
return Post
.populate(data, {
path: 'user whiskey',
populate: {
path: 'distiller style',
}
})
})
.then(function (populatedData) {
return (user.shareFB ? social.checkFB(user, populatedData) : Promise.resolve())
.then(function (FBres) {
return (user.shareTWT ? social.checkTWT(user, populatedData) : Promise.resolve())
.then(function (TWTres) {
var socialData = [TWTres, FBres];
return {
'post': populatedData,
'social': socialData
};
})
})
})
})
})
.catch(function (err) {
console.log('post create err : ', err);
})
};
das ist, wo der Brenner erzeugt und zurück versuchen:
DistillerSchema.statics.newDistiller = function (o) {
return Distiller
.findAsync({
'name': o.name
})
.then(function (distiller) {
if (distiller.length) {
return distiller[0];
}
return Distiller
.createAsync(o)
.then(function (data) {
//console.log here indicates that is is created <-- created and returned here
console.log('distiller created ', data)
return data;
})
})
.catch(function(err) {
console.log('create distiller err ', err);
})
};
Wenn Ihr Code 9 Ebenen tief verschachtelt, dann können Sie bereits feststellen, dass Sie nicht die richtigen Versprechen halten. Verschachteln Sie nicht. Kette. – trincot
Promise.resolve() übergibt undefined an die nächste Funktion in der Kette. 'Funktion (whiskyData) { whiskey = whiskyData.whiskey;' wird brechen, wenn WhiskeyData nicht definiert ist, wird direkt zum Fang übersprungen – lonewarrior556
Ja, ich sollte das Ternär entfernen. Whisky ist ein Pflichtfeld. – NoobSter