当发送到api的许多请求时,我遇到了利率限制429的问题。我正在使用api的Node.js库来使用Javascript-6承诺来发出请求。
每个承诺都有两个参数,每个请求的参数都会发生变化。
我通过使用.then()链接承诺并包含一个延迟函数来解决利率限制问题,该函数在?ms之后返回一个已解决的承诺。
let delay = (time = delay_ms) => (result) => new Promise(resolve => setTimeout(() => resolve(result), time));就像这样:
request(arg1, arg2) .then(delay(300)) .then(request(arg1, arg2)) .then(delay(300))...
这解决了速率限制问题,但我不得不使用该解决方案编写大量代码,这确实让人头疼,因为我需要编写大量的代码。
我希望arg1和arg2驻留在单独的数组中,这样我就可以迭代它们来动态构建承诺请求,并在每个请求之间包含一个延迟。
我试图使用forEach和for循环进行迭代,但是请求都是在彼此之间的毫秒内触发的,再次造成了速率限制429问题。
是否有一种解决办法:
arg1都可以存储在数组let arr1 = ['USD', 'EUR' ...]中。arg2都可以存储在数组let arr2 = [60, 300, 600 ...]中。arr1 & arr2动态地创建承诺请求,在每个请求之间有一个delay()?我的代码如下所示:
requestPromise(arg1_a, arg2_a).then(res => delay(ms)).then(requestPromise(arg1_b, arg2_b)).then(res => delay(ms))...有什么帮助吗,也许异步等待?我试过了,但我似乎无法解决这个问题?也许是因为承诺和动态争论?不确定我是否理解如何结合异步等待与动态承诺和迭代等.
任何帮助都很感激。
发布于 2018-06-15 04:01:48
如果我正确理解您要寻找的是什么,那么您需要在每个请求之间使用延迟遍历数组,调用requestPromise(x, y),其中x和y来自每个数组。
你可以这样做:
const delay_ms = 100;
function delay(t = delay_ms) {
return new Promise(resolve => {
setTimeout(resolve, t);
});
}
function iterate(a1, a2, t) {
let index = 0;
const len = Math.min(a1.length, a2.length);
if (len === 0) {
return Promise.reject(new Error("iterate(a1, a2, t) needs two non-zero length arrays"));
}
function run() {
return requestPromise(a1[index], a2[index]).then(() => {
index++;
// if still more to process, insert delay before next request
if (index < len) {
return delay(t).then(run);
}
});
}
return run();
}
// sample usage
let arr1 = ['USD', 'EUR' ...];
let arr2 = [60, 300, 600 ...];
iterate(arr1, arr2, 500).then(() => {
// all done here
}).catch(err => {
// got error here
});这是通过创建一个承诺链来实现的,其中每个新请求都被链接到前一个承诺链上,并且只在延迟之后执行。数组通过一个index变量访问,该变量被初始化为0,然后在每次迭代后递增。
此函数需要两个非零长度数组,并将迭代到两个数组中较短的数组的长度(如果由于某种原因,它们的长度不相等)。
发布于 2018-10-04 23:07:25
Promises.all()可用于处理异步调用所作承诺的返回,但是,为了处理并发请求的数量,http.request代码需要限制调用的数量。设置https.globalAgent.maxSocket = 20对我来说是一项简单的工作。这显然是在请求成为节点客户端时使用的。
发布于 2018-10-04 23:15:36
这应该非常简单,使用async/await和标准的循环。
async function iterate(arr1, arr2) {
for (let i = 0; i < arr1.length; i++) {
await requestPromise(arr1[i], arr2[i]);
await delay(300);
}
}
let arr1 = ['USD', 'EUR'];
let arr2 = [60, 300, 600];
iterate(arr1, arr2);此实现假定数组的长度相同。
https://stackoverflow.com/questions/50867306
复制相似问题