Javascript 等待所有请求调用返回后再继续
我有一个程序,它运行以下操作:Javascript 等待所有请求调用返回后再继续,javascript,node.js,typescript,asynchronous,async-await,Javascript,Node.js,Typescript,Asynchronous,Async Await,我有一个程序,它运行以下操作: async function run() { for (i of object) { request("https://www." + i + ".mydomain.com") await wait(250) // synchronous, to prevent API spam } // HERE moveOn() } 在运行moveOn()之前,如何等待收到所有请求的响应?使用http请
async function run() {
for (i of object) {
request("https://www." + i + ".mydomain.com")
await wait(250) // synchronous, to prevent API spam
}
// HERE
moveOn()
}
在运行moveOn()之前,如何等待收到所有请求的响应?使用http请求库,该库与诸如
get()之类的承诺一起工作:
这里还有几个其他相关的问题
request()
库已经存在,不建议用于新代码
有一个推荐的替代库列表,这些库都是基于承诺的
该列表中我个人最喜欢的是,它支持request()
库所做的大多数选项,但它将东西封装在更易于使用的基于承诺的API中(在我看来),并且很好地支持未来
请求之间硬编码的250毫秒等待有点粗暴。最好了解目标主机的实际限制是什么,以及这些实际限制的代码是什么,这些限制可能是最大n个请求/秒,或者在飞行中不超过n个请求,或者类似的东西,并且有一些包可以帮助您实现代码来解决这些限制是的
如果其中一个请求出现错误,您还需要有意识地决定计划是什么。此处显示的结构将中止run()
函数,因为任何一个请求都有错误。如果要以不同的方式执行操作,则需要使用try/catch
从wait got()
捕获错误,然后在catch
块中处理错误
您可以使用axios()
或got()
等。
请像这样尝试:
async function run() {
let count = 0;
for (i of object) {
axios("https://www." + i + ".mydomain.com")
.then(res => {
count++;
// Your code
})
.catch(err => {
count++;
});
await wait(250) // synchronous, to prevent API spam
}
// HERE
setInterval(() => {
if (count === object.length) {
count = 0;
moveOn()
}
}, 250);
}
看,我不想“等待”实际的请求,因为我想让每个请求发出的间隔几乎正好是250毫秒,而不是250毫秒,不管请求发出的时间有多长resolve@TomG-嗯,你的问题在那一点上不是很清楚。我编辑了我的答案,以启动相隔250毫秒的请求,但允许它们同时运行,然后等待所有结果,然后再调用moveOn()
async function run() {
let count = 0;
for (i of object) {
axios("https://www." + i + ".mydomain.com")
.then(res => {
count++;
// Your code
})
.catch(err => {
count++;
});
await wait(250) // synchronous, to prevent API spam
}
// HERE
setInterval(() => {
if (count === object.length) {
count = 0;
moveOn()
}
}, 250);
}