Javascript 用Strongloop环回实现Q
Q是a。我不完全确定这意味着什么,但我假设这至少意味着可以将Q与环回的持久模型函数一起使用,比如Javascript 用Strongloop环回实现Q,javascript,node.js,promise,q,loopbackjs,Javascript,Node.js,Promise,Q,Loopbackjs,Q是a。我不完全确定这意味着什么,但我假设这至少意味着可以将Q与环回的持久模型函数一起使用,比如find()或findOne()。我想知道如何正确设置如下内容: app.models.Question.findOne({ where: {name: "My Question"} }, function (err, result) { throw err if err }).then(function () { console.log("success") }) 我已经使
find()
或findOne()
。我想知道如何正确设置如下内容:
app.models.Question.findOne({
where: {name: "My Question"}
}, function (err, result) {
throw err if err
}).then(function () {
console.log("success")
})
我已经使用NPM在我的项目目录中安装了Q,但据我所知,app.models.Question.findOne()
仍然返回未定义的,而不是可用的Q承诺
根据,使用Q,
如果函数无法返回值或引发异常,则
阻止,它可以返回一个承诺
在这种情况下,我需要做什么才能让环回返回承诺?环回查询此时不返回承诺。请在环回存储库中发布功能请求以提醒我们(当然,在阅读之后)。然而,我相信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;
注意我还没有测试过这一点,但应该是沿着这些思路。有关更多信息,请参阅。经过一段时间的实验,我最终实现了@superkhau方法的一个变体。(请原谅咖啡剧本) 使用引导脚本中的该模块,您可以对任何现有环回模型的方法调用包装器,如下所示:
app.wrapper("Question", "findOne", [{
where: {
name: {'My Question'}
}
}]).then((question)->
console.log("Success!")
console.log(question)
)
请注意,包装器有三个参数——模型名、函数名和一个参数数组。arguments数组应该是函数在正常调用时将采用的参数数组。对承诺的支持正在进入核心,请参见:我非常喜欢流行的方法,它的方法签名与@Morslima的解决方案类似,但不必自己编写。这很好,如果你像我一样是个懒惰的程序员
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
在承诺正式进入环回之前,这不是一个坏办法。他们似乎只在内部使用,但不从他们的方法中回报承诺。那有什么用呢?看起来可能是一个有用的功能,可以实现。然后针对它们提交一个bug:-)我不会称它为一个不使用承诺的bug也就是说,我可以尝试一下(尽管我真的不确定这是否有效)。
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