Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 你如何恰当地答应你的请求?_Javascript_Promise_Bluebird - Fatal编程技术网

Javascript 你如何恰当地答应你的请求?

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

Bluebird Promission有点神奇,
request
相当混乱(这是一个函数,它的行为就像一个带有方法的对象)

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

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

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

似乎
承诺。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或其他蓝鸟方法。它没有使用蓝鸟的最新版本。注意,原始问题是关于
请求
对象的,而不是它的任何方法,这些方法(相对)简单。