你如何正确地宣传请求?

问题描述 投票:28回答:4

Bluebird promisifaction是一个小魔术,request相当混乱(它是一个作为一个方法的对象的功能)。

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

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

  • request(url) - >承诺
  • request.getAsync(url) - >承诺
  • request.postAsync(url, {}) - >承诺

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

javascript promise bluebird
4个回答
38
投票

以下应该有效:

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

请注意,这意味着request不是自由函数,因为promisification适用于原型方法,因为this事先不知道。它只适用于较新版本的蓝鸟。在需要分配cookie的请求对象时,请重复此步骤。


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

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

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


33
投票

你可以使用request-promise模块。

世界着名的HTTP客户端“请求”现在承诺/ A +兼容。蓝鸟技术支持。

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

npm install request-promise

3
投票

请注意,您不需要第三个回调参数body。它也出现在response参数上。如果你check the source你可以看到body只是response.body的便利。它们保证始终相同。

这意味着此页面上其他答案中描述的简单promisification足以获取所有响应数据。

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

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

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


2
投票

我举一个例子,由util基于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
}
© www.soinside.com 2019 - 2024. All rights reserved.