如何使用Promise.所有循环通过API调用的列表,同时也有每个调用之间的延迟?



我阅读了关于使用axios/fetch/requests从url列表(api调用)检索数据的各种不同问题。我知道以前也有人问过类似的问题。我有一些代码几乎可以工作,但我不知道如何在调用之间延迟。我的暂停没有按照我想要的方式进行。我想让它在调用之间等待3000毫秒。

const request = require('request');
var requestAsync = function(url) {
return new Promise((resolve, reject) => setTimeout(() => {
var req = request(url, (err, response, body) => {
if (err) return reject(err, response, body);
resolve(JSON.parse(body));
});
},3000))  ;
};
const urls = [
'https://jsonplaceholder.typicode.com/posts',
'https://jsonplaceholder.typicode.com/albums',
'https://jsonplaceholder.typicode.com/users'
];

var fetchURLdata = async function() {

try {
var data = await Promise.all(urls.map(requestAsync));
console.log(data)
} catch (err) {
console.error(err);
}
console.log(data);
}
fetchURLdata();

如果您希望请求是串行的,而不是并行的,那么使用for循环会更有意义:

const requestAsync = (url) => new Promise((resolve, reject) => {
request(url, (err, response, body) => {
if (err) reject(err, response, body);
else resolve(JSON.parse(body));
});
});
const delay = ms => new Promise(res => setTimeout(res, ms));
const fetchURLdata = async () => {
try {
const data = [];
for (const url of urls) {
data.push(await requestAsync(url));
await delay(3000);
}
console.log(data);
} catch (err) {
console.error(err);
}
};

除了上面的答案,我还想补充一点,Promise.all正在并发地处理您的请求,而不是一次处理一个。要了解我的意思,请尝试在这里输入控制台登录:

var requestAsync = function(url) {
// NEW CODE HERE
console.log("This request is being executed at:", Date.now()) 
// END NEW CODE
return new Promise((resolve, reject) => setTimeout(() => {
var req = request(url, (err, response, body) => {
if (err) return reject(err, response, body);
resolve(JSON.parse(body));
});
},3000))  ;
};

您应该看到每个请求同时启动。

我同意你想把这个扔进一个for循环来获得你想要的顺序行为。

最新更新