用Strongloop环回实现Q

Implementing Q with Strongloop Loopback

本文关键字:实现 Strongloop      更新时间:2023-09-26

Q是环回的"支持模块"。我不完全确定这意味着什么,但我假设这至少意味着可以将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 promise。

根据环回文档,使用Q,

如果函数不能返回值或引发异常阻止,它可以返回一个承诺。

在这种情况下,我需要做什么才能获得回送以返回承诺?

LoopBack查询此时不返回promise。请在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-推迟了解更多信息。

对promise的支持正在进入核心,请参阅:https://github.com/strongloop/loopback/issues/418

经过更多的实验,我最终实现了@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

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

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

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

我是流行的Q promise库的Q.ninvoke方法的超级粉丝,它的方法签名类似于@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之前,这不是一种糟糕的生活方式。