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将用于相同目的的库。
- var q = require('q'); //使用q库
- 不要修改你的模型。 他们必须将callback作为最后一个参数(遵循节点约定)
- var server.models.Student.upsertWithPromice = q.denodeify(server.models.Student.upsert);
- 利润。
那么你的例子中的代码应该可以正常工作。