这个问题是关于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();
我测试了这种行为,它很清楚。