猫鼬保存承诺并填充
Mongoose save with promises and populate
我有以下代码(Mongoose 已被 Bluebird 承诺)
function createNewCourse(courseInfo, teacherName) {
var newCourse = new courseModel({
cn: courseInfo.courseName,
cid: courseInfo.courseId
});
return newCourse.saveAsync()
.then(function (savedCourse) {
var newTeacher = new newTeacherModel({
na: teacherName,
_co: savedCourse._id // This would be an array
});
return newTeacher.saveAsync().then(function() {
return newCourse;
});
});
}
这是对我的问题的简化,但它很好地说明了问题。我希望我的 createNewCourse 函数 return 承诺,一旦解决,将 return 新保存的课程, 而不是 老师。上面的代码可以,但是不够优雅,没有很好地使用 promises 来避免回调地狱。
我考虑的另一个选择是 return 学习课程然后进行填充,但这意味着重新查询数据库。
有什么办法可以简化这个吗?
编辑:我认为 post 保存代码可能有用,但使用本机回调(省略错误处理)
function createNewCourse(courseInfo, teacherName, callback) {
var newCourse = new courseModel({
cn: courseInfo.courseName,
cid: courseInfo.courseId
});
newCourse.save(function(err, savedCourse) {
var newTeacher = new newTeacherModel({
na: teacherName,
_co: savedCourse._id // This would be an array
});
newTeacher.save(function(err, savedTeacher) {
callback(null, newCourse);
});
});
}
使用.return()
:
function createNewCourse(courseInfo, teacherName) {
var newCourse = new courseModel({
cn: courseInfo.courseName,
cid: courseInfo.courseId
});
return newCourse.saveAsync().then(function (savedCourse) {
var newTeacher = new newTeacherModel({
na: teacherName,
_co: savedCourse._id // This would be an array
});
return newTeacher.saveAsync();
}).return(newCourse);
}
还记得链接是如何工作的吗?
.then(function() {
return somethingAsync().then(function(val) {
...
})
})
等同于(忽略任何闭包变量):
.then(function() {
return somethingAsync()
})
.then(function(val) {
...
})
return(x)
等同于 .then(function(){return x;})
我有以下代码(Mongoose 已被 Bluebird 承诺)
function createNewCourse(courseInfo, teacherName) {
var newCourse = new courseModel({
cn: courseInfo.courseName,
cid: courseInfo.courseId
});
return newCourse.saveAsync()
.then(function (savedCourse) {
var newTeacher = new newTeacherModel({
na: teacherName,
_co: savedCourse._id // This would be an array
});
return newTeacher.saveAsync().then(function() {
return newCourse;
});
});
}
这是对我的问题的简化,但它很好地说明了问题。我希望我的 createNewCourse 函数 return 承诺,一旦解决,将 return 新保存的课程, 而不是 老师。上面的代码可以,但是不够优雅,没有很好地使用 promises 来避免回调地狱。
我考虑的另一个选择是 return 学习课程然后进行填充,但这意味着重新查询数据库。
有什么办法可以简化这个吗?
编辑:我认为 post 保存代码可能有用,但使用本机回调(省略错误处理)
function createNewCourse(courseInfo, teacherName, callback) {
var newCourse = new courseModel({
cn: courseInfo.courseName,
cid: courseInfo.courseId
});
newCourse.save(function(err, savedCourse) {
var newTeacher = new newTeacherModel({
na: teacherName,
_co: savedCourse._id // This would be an array
});
newTeacher.save(function(err, savedTeacher) {
callback(null, newCourse);
});
});
}
使用.return()
:
function createNewCourse(courseInfo, teacherName) {
var newCourse = new courseModel({
cn: courseInfo.courseName,
cid: courseInfo.courseId
});
return newCourse.saveAsync().then(function (savedCourse) {
var newTeacher = new newTeacherModel({
na: teacherName,
_co: savedCourse._id // This would be an array
});
return newTeacher.saveAsync();
}).return(newCourse);
}
还记得链接是如何工作的吗?
.then(function() {
return somethingAsync().then(function(val) {
...
})
})
等同于(忽略任何闭包变量):
.then(function() {
return somethingAsync()
})
.then(function(val) {
...
})
return(x)
等同于 .then(function(){return x;})