我使用Swagger创建用于调用一组REST端点的JS API客户端。我正在配置Swagger客户端以使用Promises(new Swagger({ spec: spec, usePromise: true })
)。
我在Swagger之前的require
蓝鸟,使用蓝鸟的承诺。但是在尝试使用Promise.return
时我的应用程序正在爆炸。
代码看起来像
client.user.get_db_user(db).return("foo");
其中client是Swagger引用。
我得到的错误是
app: TypeError: client.user.get_db_user(...).return is not a function
如果我将return
替换为then(() => value)
,则此功能正常。 return
应该是then
的这种使用的简写。
经过调查,我发现Swagger客户退回的承诺失败了。
发生了什么?
答案 0 :(得分:2)
似乎你不能告诉Swagger使用Bluebird的承诺。但是,在您想要使用Bluebird方法的特定位置,您可以将Swagger承诺“转换”为Bluebird承诺,然后使用Bluebird的功能。要转换这样的承诺,您只需将其包装在Promise.resolve()
:
const Promise = require('bluebird');
Promise.resolve(client.user.get_db_user(db)).return(...)
虽然在这种特定情况下,由于.return()
只是为了节省一些打字,因此在Promise.resolve()
中包装先前的承诺后,它实际上并不是净节省。但是,对于更有意义的方法,如.map()
或类似的方法,它可能更有用。
答案 1 :(得分:1)
事实证明,Swagger明确地使用了Q promise库。
蓝鸟和Q部分兼容,所以很多东西都可以正常工作。尝试使用Q没有的Bluebird API部分时会出现问题。特别是,Bluebird有“返回”,而Q则没有。
最简单的答案是使用问题中讨论的then
结构。
我尚未尝试的其他可行解决方案: