无法获得对 return 价值的嵌套承诺到下一个承诺链
Cannot get nested promises to return value to next promise chain
在下面,您将看到我在注释代码中遇到问题的地方。我有一个嵌套的承诺,它在集合中创建一个对象,然后 returns 它。
但是,我认为我遇到了异步问题。该函数在创建的对象被嵌套 promise returned 之前完成。
我仍在掌握 promise 链,我可能在这里做错了很多。如果我能清理/压平其中的一些,那么其中的大部分可能会被清理干净。
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);
})
};
这是创建蒸馏器并尝试 return:
的地方
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);
})
};
听起来像是分组错误。而不是
return o.distiller.new === true && !whiskey.distiller
? Distiller.newDistiller(o.distiller.value)
: Promise.resolve().then(…) // callback only called when no new distiller
你想要
return (o.distiller.new && !whiskey.distiller
? Distiller.newDistiller(o.distiller.value)
: Promise.resolve()
).then(…) // callback always called
至少所有其他条件都是这样:-)
I'm still grasping promise chaining
在了解到你总是需要从你的异步函数中 return
(你做的很好)之后,你应该看看 how it is possible to flatten a chain(当所有条件都适用时,它适用于你的代码只是本地表达式,而不是早期 returns)。此外,我建议不要缩进链接的方法调用,因为在嵌套 then
回调时这很快就会失控,但这只是我个人的偏好。
在下面,您将看到我在注释代码中遇到问题的地方。我有一个嵌套的承诺,它在集合中创建一个对象,然后 returns 它。
但是,我认为我遇到了异步问题。该函数在创建的对象被嵌套 promise returned 之前完成。
我仍在掌握 promise 链,我可能在这里做错了很多。如果我能清理/压平其中的一些,那么其中的大部分可能会被清理干净。
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);
})
};
这是创建蒸馏器并尝试 return:
的地方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);
})
};
听起来像是分组错误。而不是
return o.distiller.new === true && !whiskey.distiller
? Distiller.newDistiller(o.distiller.value)
: Promise.resolve().then(…) // callback only called when no new distiller
你想要
return (o.distiller.new && !whiskey.distiller
? Distiller.newDistiller(o.distiller.value)
: Promise.resolve()
).then(…) // callback always called
至少所有其他条件都是这样:-)
I'm still grasping promise chaining
在了解到你总是需要从你的异步函数中 return
(你做的很好)之后,你应该看看 how it is possible to flatten a chain(当所有条件都适用时,它适用于你的代码只是本地表达式,而不是早期 returns)。此外,我建议不要缩进链接的方法调用,因为在嵌套 then
回调时这很快就会失控,但这只是我个人的偏好。