繁体   English   中英

您如何正确承诺请求?

[英]How do you properly promisify request?

Bluebird promisifaction 是一个小魔法,而request是一团糟(它是一个具有方法的对象的函数)。

具体场景非常简单:我有一个启用了 cookie 的请求实例,通过 cookie jar(不使用request的全局 cookie 处理程序)。 我怎样才能有效地承诺它,以及它支持的所有方法?

理想情况下,我希望能够:

  • 调用request(url) -> Promise
  • 调用request.getAsync(url) -> Promise
  • 调用request.postAsync(url, {}) -> Promise

似乎Promise.promisifyAll(request)无效(因为我收到“未定义 postAsync”)。

以下应该工作:

var request = Promise.promisify(require("request"));
Promise.promisifyAll(request);

请注意,这意味着request不是一个自由函数,因为 promisification 与原型方法一起工作,因为this事先不知道。 它仅适用于较新版本的 bluebird。 当您需要分叉 cookie 的请求对象时重复它。


如果您使用的是 Bluebird v3,则需要使用multiArgs选项:

var request = Promise.promisify(require("request"), {multiArgs: true});
Promise.promisifyAll(request, {multiArgs: true})

这是因为 request 的回调是(err, response, body) :Bluebird v3 的默认行为是只采用第一个成功值参数(即response )并忽略其他参数(即body )。

您可以使用request-promise模块。

世界著名的 HTTP 客户端“Request”现在符合 Promises/A+。 由蓝鸟提供支持。

安装模块,您可以使用 promise 样式的请求。

npm install request-promise

请注意,您不需要第三个回调参数body 它也存在于response参数中。 如果您查看源代码,您会发现body只是response.body一种方便。 它们保证始终相同。

这意味着本页其他答案中描述的简单承诺足以获取所有响应数据。

const request = require('request')
const { promisify } = require('util')
const rp = promisify(request)

rp('https://example.com').then(({body, statusCode}) => ...)

这仅适用于传递给回调/承诺的response 传递给响应事件response对象是标准的http.IncomingMessage ,因此没有body属性。

我举个例子,通过util base on Node.js v11.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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM