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返回一个承诺?
答案 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.ninvoke
的Q 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之前,这并不是一个糟糕的方式。