何时以请求-承诺形式发送请求?



这个问题是关于请求的,也可以映射到request-promise。

在以下示例中:

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

何时发送请求?

  • 当调用rp(...)并且返回的承诺是等待响应时,它是否在Line 1发送?
  • 还是在执行返回的承诺时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();

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

您可以自己轻松地玩这个,将一个小应用程序放在一起,例如

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请求,这实际上不是节点.js方式!

最新更新