猫鼬用承诺保存并填充

Mongoose save with promises and populate

本文关键字:填充 保存 承诺      更新时间:2023-09-26

>我有以下代码(猫鼬已被蓝鸟承诺)

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 函数返回一个承诺,一旦解决,将返回新保存的课程,而不是教师。上面的代码有效,但它并不优雅,并且不能很好地使用 promise 来避免回调地狱。

我考虑的另一种选择是返回课程,然后进行填充,但这意味着重新查询数据库。

任何想法如何简化这一点?

编辑:我认为发布保存代码但使用本机回调(省略错误处理)可能很有用

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;})