Bluebird Promise with Swagger:return 不是函数
Bluebird Promise with Swagger: return is not a function
我正在使用 Swagger 创建我的 JS API 客户端来调用一组 REST 端点。我正在配置 Swagger 客户端以使用 Promises (new Swagger({ spec: spec, usePromise: true })
).
I require
Bluebird 在 Swagger 之前,使用 Bluebird promises。但是我的应用程序在尝试使用 Promise.return
.
时崩溃了
代码看起来像
client.user.get_db_user(db).return("foo");
其中客户端是 Swagger 引用。
我得到的错误是
app: TypeError: client.user.get_db_user(...).return is not a function
如果我用 then(() => value)
替换 return
就可以了。对于 then
.
的这种用法,return
应该是 shorthand
经过调查,我发现它未能兑现 Swagger 客户端返回的承诺。
发生什么事了?
事实证明,Swagger 在幕后显式地使用了 Q promise 库。
Bluebird 和 Q 部分兼容,所以很多东西都可以正常工作。尝试使用 Q 没有的部分 Bluebird API 时会出现问题。
特别是,Bluebird 有 "return",而 Q 没有。
最简单的答案是使用问题中讨论的 then
结构。
我尚未尝试的其他可能的解决方案:
- 使用 "bluebird-q" 项目将 Q 替换为 Bluebird。
- promisifyAll Swagger 而不是使用 Swagger 的 built-in promise 支持。
您似乎无法告诉 Swagger 使用 Bluebird 承诺。但是,在您想要使用 Bluebird 方法的特定位置,您可以 "cast" Swagger 承诺到 Bluebird 承诺,然后使用 Bluebird 的功能。要转换这样的承诺,您只需将其包装在 Promise.resolve()
:
const Promise = require('bluebird');
Promise.resolve(client.user.get_db_user(db)).return(...)
虽然在这种特定情况下,由于 .return()
只是为了节省您的一些输入,但在您将之前的承诺包装在 Promise.resolve()
之后,它并不是真正的净节省。但是,对于像 .map()
或类似的更有意义的方法,它可能更有用。
我正在使用 Swagger 创建我的 JS API 客户端来调用一组 REST 端点。我正在配置 Swagger 客户端以使用 Promises (new Swagger({ spec: spec, usePromise: true })
).
I require
Bluebird 在 Swagger 之前,使用 Bluebird promises。但是我的应用程序在尝试使用 Promise.return
.
代码看起来像
client.user.get_db_user(db).return("foo");
其中客户端是 Swagger 引用。
我得到的错误是
app: TypeError: client.user.get_db_user(...).return is not a function
如果我用 then(() => value)
替换 return
就可以了。对于 then
.
return
应该是 shorthand
经过调查,我发现它未能兑现 Swagger 客户端返回的承诺。
发生什么事了?
事实证明,Swagger 在幕后显式地使用了 Q promise 库。
Bluebird 和 Q 部分兼容,所以很多东西都可以正常工作。尝试使用 Q 没有的部分 Bluebird API 时会出现问题。
特别是,Bluebird 有 "return",而 Q 没有。
最简单的答案是使用问题中讨论的 then
结构。
我尚未尝试的其他可能的解决方案:
- 使用 "bluebird-q" 项目将 Q 替换为 Bluebird。
- promisifyAll Swagger 而不是使用 Swagger 的 built-in promise 支持。
您似乎无法告诉 Swagger 使用 Bluebird 承诺。但是,在您想要使用 Bluebird 方法的特定位置,您可以 "cast" Swagger 承诺到 Bluebird 承诺,然后使用 Bluebird 的功能。要转换这样的承诺,您只需将其包装在 Promise.resolve()
:
const Promise = require('bluebird');
Promise.resolve(client.user.get_db_user(db)).return(...)
虽然在这种特定情况下,由于 .return()
只是为了节省您的一些输入,但在您将之前的承诺包装在 Promise.resolve()
之后,它并不是真正的净节省。但是,对于像 .map()
或类似的更有意义的方法,它可能更有用。