2015-02-02 2 views
2

Я следующий код (Mongoose был promisified с Bluebird)Mongoose сохранить обещания и заполнить

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 вернула обещание, что после разрешения вернет вновь сохраненный курс, не учитель. Вышеприведенный код работает, но он не изящный и не использует обещания, чтобы избежать обратного ад.

Другой вариант, который я рассмотрел, возвращает курс, а затем выполняет заполнение, но это будет означать повторное запрос базы данных.

Любые идеи, как это упростить?

Edit: Я думал, что это может быть полезно, чтобы получить возможность отправлять сохранения кода, но с использованием собственных функций обратного вызова (исключая обработки ошибок)

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

ответ

4

Использование .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;})

Смежные вопросы