2015-02-10 48 views
3

Q是"supporting module" of loopback。我不完全确定这是什么意思,但我认为它至少意味着可以将Q与loopback的持久型号功能一起使用,例如find()findOne()。我想知道如何正确设置类似以下内容:我用Strongloop Loopback实现Q

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()仍返回undefined,而不是可用Q诺。

按照loopback docs,使用Q,

如果一个函数不能返回值或抛出一个异常,而不 阻塞,它可以返回一个承诺来代替。

我需要做什么才能让环回在这种情况下返回承诺?

+0

他们似乎只在内部使用它,但是不会从他们的方法返回承诺。 – Bergi 2015-02-10 13:50:53

+0

那有什么用?似乎可能是一个有助于实现的功能。 – 2015-02-10 13:57:13

+0

然后提交一个对他们的错误:-) – Bergi 2015-02-10 14:09:33

回答

2

LoopBack查询在此时不返回承诺。请在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

经过多一点实验后,我终于实现了@ 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) 
) 

注意包装有三个参数 - 型号名称,函数名和一系列参数。参数数组应该是函数在正常调用时所需参数的数组。

-1

我是流行Q promise libraryQ.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。