【问题标题】:Promisfy loopback modelsPromisfy 环回模型
【发布时间】:2016-06-26 03:02:42
【问题描述】:

在单元测试 Loopback 中,有必要使用带有 upsert 方法的回调。所以例如......而不是像这样写一些东西:

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


})

有必要确保回调与 upsert 一起使用。由于我有很多模型,我在下面初始化我使用异步:

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

})

如何将上面的代码改为使用 Promises,而不是异步?

我的想法是,有了 Promise,我就可以编写一些如下所示的代码:

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()


    })
})

【问题讨论】:

    标签: node.js loopbackjs strongloop


    【解决方案1】:

    有两种可能的解决方案。首先是手动承诺。 您的函数将如下所示:

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

    第二种解决方案将使用库用于相同目的。

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

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

    【讨论】:

    • 这太棒了,非常有帮助!你提到 q 而不是 Bluebird。 q 是否更适合这种类型的承诺?
    • 它们都是相似的库并且具有几乎相同的功能。我只是使用 Q 并有一个活生生的例子。
    • 有道理。用我认为您建议的更改编辑了原始问题。如问题所述,找不到 id :(
    • 改变了使用蓝鸟的例子......就像一个魅力。
    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 2018-09-28
    • 2016-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多