在请求承诺中发送请求的时间是什么时候?

时间:2018-03-06 15:29:24

标签: node.js request request-promise

此问题与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的comment请求 - 承诺实际上对请求进行排队,并且不会立即发送请求。一旦控件返回到事件循环,就会发送排队的请求。

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

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();

我测试了这种行为并且很清楚。

1 个答案:

答案 0 :(得分: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.中的所有异步操作一样。 / p>

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方式!