Javascript 你如何恰当地答应你的请求?
Bluebird Promission有点神奇,Javascript 你如何恰当地答应你的请求?,javascript,promise,bluebird,Javascript,Promise,Bluebird,Bluebird Promission有点神奇,request相当混乱(这是一个函数,它的行为就像一个带有方法的对象) 具体的场景非常简单:我有一个启用了cookie的请求实例,通过cookie jar(不使用request的全局cookie处理程序)。我如何才能有效地承诺它,以及它支持的所有方法 理想情况下,我希望能够: 调用请求(url)->Promise 调用request.getAsync(url)->Promise 调用request.postAsync(url,{})->Promi
request
相当混乱(这是一个函数,它的行为就像一个带有方法的对象)
具体的场景非常简单:我有一个启用了cookie的请求实例,通过cookie jar(不使用request
的全局cookie处理程序)。我如何才能有效地承诺它,以及它支持的所有方法
理想情况下,我希望能够:
- 调用
->Promise请求(url)
- 调用
->Promiserequest.getAsync(url)
- 调用
->Promiserequest.postAsync(url,{})
似乎
承诺。promisifyAll(请求)
无效(因为我得到的是“postAsync未定义”)。以下操作应该有效:
var request = Promise.promisify(require("request"));
Promise.promisifyAll(request);
请注意,这意味着request
不是一个自由函数,因为promisification与原型方法一起工作,因为这个
事先不知道。它只适用于更新版本的蓝鸟。在为Cookie派生请求对象时,需要时重复此操作
如果您使用的是Bluebird v3,则需要使用
multiArgs
选项:
var request = Promise.promisify(require("request"), {multiArgs: true});
Promise.promisifyAll(request, {multiArgs: true})
这是因为请求的回调是(err,response,body)
:Bluebird v3的默认行为是只接受第一个成功值参数(即response
),而忽略其他参数(即body
)。您可以使用该模块
世界著名的HTTP客户端“请求”现在承诺与/A+兼容。
由蓝鸟提供动力
安装模块后,您可以使用promise样式的请求
npm install request-promise
我举了一个例子,基于Node.jsv11.10.0
import { get, post } from "request";
import { promisify } from "util";
const [getAsync, postAsync] = [get, post].map(promisify);
getAsync("http://stackoverflow.com")
.then(({statusCode, body}) => {
//do something
});
或者,等效地使用async/await
:
const foo = async () => {
const {statusCode, body} = await getAsync("http://stackoverflow.com")
// do something
}
请注意,您不需要第三个回调参数
body
。它也出现在响应
参数中。如果您可以看到body
只是响应的一种方便。body
。它们保证永远是一样的
这意味着本页其他答案中描述的简单提示就足以获得所有响应数据
const request = require('request')
const { promisify } = require('util')
const rp = promisify(request)
rp('https://example.com').then(({body, statusCode}) => ...)
这仅适用于传递给回调/承诺的
响应。传递给响应事件的response
对象是一个标准的http.IncomingMessage
,因此没有body
属性。完全公开,我是作者:。@idbehold你只需要公开一些关于它们的事情:p这不是小事,请考虑在问题跟踪器中打开一个问题。不是<代码>请求(…)>代码>与<代码>请求相同吗?获取(…)<代码>?你为什么两者都需要?@Esailija我想是的,但主要是为了避免混淆。我想关键是所有的API都是promisified的,我没有挂起回调,因为我没有意识到我需要它。严格地说,是的。这两个选项中有一个是可选的。如何处理请求的cookies?因为据我所知,它创建了一个新的request
实例,其中包含一个cookie jarit@SecondRikudo它现在在新蓝鸟身上起作用。请查看:)当您说“更新版本”时,具体是哪个版本?Bluebird的promisification与发送到请求的响应和正文参数有什么关系。get()
回调?它是否忽略了主体,只使用response
参数作为promise的解析值?@Retsam这只是{multiArgs:true}
,这是答案的一部分。妮特:没有.tapCatch或其他蓝鸟方法。它没有使用蓝鸟的最新版本。注意,原始问题是关于请求
对象的,而不是它的任何方法,这些方法(相对)简单。