0

这个问题是关于request的,也可能映射到request-promise

在以下示例中:

let myPromise = rp('http://www.google.com'); // Line 1

// do something ...

await myPromise; // Line 2

什么时候发送请求?

  • Line 1它是在被调用时发送的rp(...)并且返回的承诺是等待响应吗?
  • 还是在Line 2执行返回的承诺时发送?

根据下面的例子,答案是:rp(...)不发送请求。它实际上将调用添加到稍后将执行以发送请求的事件循环。

// server.js
var http = require('http');

const server = http.createServer((req, res) => {
    console.log(new Date().toISOString(), ' - Request received by server.');
    res.end('All good');
});

server.listen(3001);

-

// client.js
var rp = require('request-promise');

rp('http://localhost:3001');

console.log('something');
// Break point

从我的试验看来,如果进程没有返回事件循环,则不会发送请求。

有没有办法让请求立即发生并稍后等待?

是否有另一个库可以保证在返回“承诺提供响应”之前发送请求?

编辑:

根据@terry-lenoxx 的评论request-promise 实际上将请求排队并且不会立即发送请求。一旦控件返回事件循环,排队的请求将被发送。

这对我的情况很有用,即我想一起发送多个请求并稍后加入每个响应。这可以很容易地完成,如下所示:

var rp = require('request-promise');

async function doSomething() {
    let req1 = rp('http://localhost:3001'); // Queue req1
    let req2 = rp('http://localhost:3001'); // Queue req2

    let response1 = await req1; // Send both req1, req2 and wait for response of req1
    let response2 = await req2; // wait for response of req2

    console.log('something');
}

doSomething();

我测试了这种行为,它很清楚。

4

1 回答 1

0

你可以很容易地自己玩这个,把一个小应用程序放在一起,例如

var rp = require('request-promise');
var http = require('http');

const server = http.createServer((req, res) => {
    console.log(new Date().toISOString(), ' - Request received by server.');
});

server.listen(3001);

console.log(new Date().toISOString(), ' - Sending request to server.');
rp('http://localhost:3001');

您可以看到请求将被接收,而无需等待承诺。请求几乎会在您排队时立即执行,而不是同时执行,因为它将被发送到 I/O 队列,就像 node.js 中的所有异步操作一样。

await 行实际上是 promise.then() 的语法糖,或者换句话说,它只是以更易读的形式创建回调。

然后您可以添加如下所示的等待,这对请求排队过程没有影响。

var rp = require('request-promise');
var http = require('http');

const server = http.createServer((req, res) => {
    console.log(new Date().toISOString(), ' - Request received by server.');
    res.end('All good');
});

server.listen(3001);

async function sendRequest() {
    console.log(new Date().toISOString(), ' - Requesting..');
    let myPromise = rp('http://localhost:3001');

    console.log(new Date().toISOString(), ' - Awaiting response');
    var result = await myPromise;
    console.log(new Date().toISOString(), ' - Response received');
};

sendRequest();

所以答案真的在第 1 行之后很快。但不完全在同一时间。当然,这意味着它可能会发生第 2 行之后。因为它是在另一个线程上执行的。

如果您希望请求立即发生,您的意思是同步发送 HTTP 请求,这真的不是 node.js 的方式!

于 2018-03-06T18:40:35.823 回答