Promisfy回送模型

在unit testing环回中,有必要使用upsert方法进行callback。 所以,例如…而不是写一些东西沿线:

before(function () { Student = server.models.Student Course = server.models.Course Course.upsert({id: 1, key: 'A', department: 'Original department'}) Student.upsert({id: 1, points: 5000}) }) 

有必要确保callback与upsert一起使用。 由于我有很多模型,我正在初始化下面我使用asynchronous:

 before(function (done) { Student = server.models.Student Course = server.models.Course async.waterfall([ function (callback) { Course.upsert({id: 1, key: 'A', department: 'Original department'}, callback) }, function (f, callback) { Student.upsert({id: 1, points: 5000}, callback) }, ], function (err, results) { done(err) }) }) 

上面的代码如何改为使用Promise而不是async?

我的想法是,有了承诺,我可以写一些看起来像这样的代码:

 before(function (done) { Student = server.models.Student Course = server.models.Course Course.upsert({id: 1, key: 'A', department: 'Original department'}) .then(Student.upsert({id: 1, points: 5000}) .then(function(err) { done(err) } }) 

但我一直没有成功兑现承诺。

编辑从下面的答案…

  before(function (done) { Course = server.models.Course Course.upsertWithPromise = Promise.promisify(Course.upsert) Course.upsertWithPromise({id: 1, key: 'A', department: 'Original department'}) .then(done) } it.only('Course upsert', function (done) { Course.findById(1, function (err, course) { expect(course.id).to.equal(1) expect(course.department).to.equal('Original department') done() }) }) 

有两种可能的解决scheme。 首先是手动promisification。 你的function如下所示:

 server.models.Student.upsert = function(data) { // Note NO CALLBACK return new Promise(function(resolve, reject) { // Here can do all async staff and when done sucessfully call: resolve(result); // OR on error call: reject(err); }); } 

第二个解决scheme将用于相同目的的库。

  1. var q = require('q'); //使用q库
  2. 不要修改你的模型。 他们必须将callback作为最后一个参数(遵循节点约定)
  3. var server.models.Student.upsertWithPromice = q.denodeify(server.models.Student.upsert);
  4. 利润。

那么你的例子中的代码应该可以正常工作。