用Strongloop Loopback实现Q.

时间:2015-02-10 11:25:39

标签: javascript node.js promise q loopbackjs

Q是"supporting module" of loopback。我并不完全确定这意味着什么,但我认为它至少意味着可以使用Q和loopback的持久模型函数,如find()或{{1 }}。我想知道如何正确设置如下内容:

findOne()

我已经使用NPM在我的项目目录中安装了Q,但据我所知,app.models.Question.findOne({ where: {name: "My Question"} }, function (err, result) { throw err if err }).then(function () { console.log("success") }) 仍然是未定义的,而不是可用的Q承诺。

根据loopback docs,使用Q,

  

如果函数无法返回值或抛出异常而没有   阻止,它可以返回一个承诺。

在这种情况下,我需要做些什么才能让loopback返回一个承诺?

4 个答案:

答案 0 :(得分:2)

LoopBack查询此时不返回promises。请在LoopBack存储库中发布功能请求以提醒我们(当然,在阅读https://github.com/strongloop/loopback/wiki/Issues之后)。但是,我确实相信ES6的承诺是在路线图上。

那就是说,你可以创建自己的承诺,然后返回:

var deferred = Q.defer();
app.models.Question.findOne({
  where: {
    name: 'My Question'
  }
}, function(err, result) {
  if (err) return deferred.reject(err);
  deferred.resolve(result);
});
return deferred.promise;

注意我还没有测试过这个,但它应该是这样的。有关详细信息,请参阅https://github.com/kriskowal/q#using-deferreds

答案 1 :(得分:1)

经过一些实验,我最终实现了@ superkhau方法的变体。 (原谅咖啡脚本)。

app.wrapper = (model, fn, args)->
    deferred = Q.defer()
    args.push((err, result)->
        throw err if err
        deferred.resolve(result)
    )
    app.models[model][fn].apply(app.models[model], args)
    return deferred.promise

使用bootscript中的该模块,您可以在任何现有的环回模型的方法上调用包装器,如下所示:

app.wrapper("Question", "findOne", [{
    where: {
        name: {'My Question'}
    }
}]).then((question)->
    console.log("Success!")
    console.log(question)
)

请注意,包装器有三个参数 - 模型名称,函数名称和参数数组。 arguments数组应该是函数在正常调用时将采用的参数数组。

答案 2 :(得分:1)

对承诺的支持即将进入核心,请参阅:https://github.com/strongloop/loopback/issues/418

答案 3 :(得分:-1)

我非常喜欢流行的Q.ninvokeQ promise library方法,它的方法签名类似于@ Morslamina的解决方案,但没有必须 - 自己动手部分。如果你像我一样懒惰的编码器,这很好。

loopback = require 'loopback'
q = require('q').ninvoke

app = module.exports = loopback()

app.get '/apples/:id', (res, req) ->
  q(app.models.Apple, 'findById', req.params.id).done (apple) ->
    res.render 'apple', apple: apple

在承诺正式登陆Loopback之前,这并不是一个糟糕的方式。