Javascript 用Strongloop环回实现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") }) 我已经使

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")
})
我已经使用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