- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
到目前为止,这是我的代码:
const allRows = [];
async function fileToLines(file) {
return new Promise((resolve, reject) => {
reader = new FileReader();
reader.onload = function(e) {
parsedLines = e.target.result.split(/\r|\n|\r\n/);
resolve(parsedLines);
};
reader.readAsText(file);
});
}
document
.getElementById('fileInput')
.addEventListener('change', async function(e) {
var file = e.target.files[0];
if (file != undefined) {
fileToLines(file).then( async id => {
console.log(id)
console.log(parsedLines)
console.log(typeof id);
var idInt = id.map(Number);
var idFiltered = id.filter(function(v){return v!==''});
console.log(idFiltered)
for(let id of idFiltered) {
const row = await getRelease(id);
allRows.push(row);
}
download();
});
}
});
function getRelease(idFiltered) {
return fetch(`https://api.***.com/releases/${idFiltered}`, {
headers: {
'User-Agent': '***/0.1',
},
})
.then(response => response.json())
.then(data => {
if (data.message === 'Release not found.') {
return { error: `Release with ID ${idFiltered} does not exist` };
} else {
const id = data.id;
const delimiter = document.getElementById("delimiter").value || "|";
const artists = data.artists ? data.artists.map(artist => artist.name) : [];
const barcode = data.identifiers.filter(id => id.type === 'Barcode')
.map(barcode => barcode.value);
var formattedBarcode = barcode.join(delimiter);
const country = data.country || 'Unknown';
const genres = data.genres || [];
const formattedGenres = genres.join(delimiter);
const labels = data.labels ? data.labels.map(label => label.name) : [];
const formattedLabels = labels.join(delimiter);
const catno = data.labels ? data.labels.map(catno => catno.catno) : [];
const formattedCatNo = catno.join(delimiter);
const styles = data.styles || [];
const formattedStyles = styles.join(delimiter);
const tracklist = data.tracklist ? data.tracklist
.map(track => track.title) : [];
const formattedTracklist = tracklist.join(delimiter);
const year = data.year || 'Unknown';
const format = data.formats ? data.formats.map(format => format.name) : [];
const qty = data.formats ? data.formats.map(format => format.qty) : [];
const descriptions = data.formats ? data.formats
.map(descriptions => descriptions.descriptions) : [];
const preformattedDescriptions = descriptions.toString()
.replace('"','""').replace(/,/g, ', ');
const formattedDescriptions = '"' + preformattedDescriptions + '"';
return [idFiltered,
artists,
format,
qty,
formattedDescriptions,
formattedLabels,
formattedCatNo,
country,
year,
formattedGenres,
formattedStyles,
formattedBarcode,
formattedTracklist
];
}
});
}
function download() {
const ROW_NAMES = [
"release_id",
"artist",
"format",
"qty",
"format descriptions",
"label",
"catno",
"country",
"year",
"genres",
"styles",
"barcode",
"tracklist"
];
var csvContent = "data:text/csv;charset=utf-8,"
+ ROW_NAMES + "\n" + allRows.map(e => e.join(",")).join("\n");
console.log(csvContent);
var encodedUri = encodeURI(csvContent);
var link = document.createElement("a");
link.setAttribute("href", encodedUri);
link.setAttribute("download", "my_data.csv");
document.body.appendChild(link); // Required for FF
link.click();
}
当我在 2.5 年前(!)尝试破解这个问题时,有人告诉我最简单的方法“是维护一个 promise 链来跟踪请求”,就像这样......
const timer = ms => new Promise(resolve => setTimeout(resolve, ms));
let requests = Promise.resolve();
function getRelease(id) {
const apiCall = requests.then(() =>
fetch(`https://api.***.com/releases/${id}`, {
headers: {
'User-Agent': '***/0.1',
}
})
);
// add to chain / queue
requests = apiCall.then(response =>
+response.headers.get("X-***-Ratelimit-Remaining") <= 1 && timer(60 * 1000)
);
return apiCall
.then(response => response.json())
.then(parseReleaseData);
}
建议此代码的人评论...
Now one request will be done after another, and if the rate limit gets reached it waits a minute.
You might want to retry in case of a rate limiting error. You could also add multiple promise queues to allow for higher throughput.
似乎我之前尝试过时,它在进行任何调用之前设置了 60 秒的延迟?我想我想再次尝试这种方法,但我不确定如何编码。比如,我不确定 const apiCall = requests.then(() =>
如何适合我当前的代码。我可以看到建议的代码实际上返回“apiCall”,而我的方法设置为返回所有单独的数据字段,所以我不确定如何在那里进行。这似乎是从主机获取 Ratelimit
并根据需要设置超时的好方法,但是我真的不确定从哪里开始。有什么帮助吗?
编辑:我一直在尝试这样做,但还是不行:
const timer = ms => new Promise(resolve => setTimeout(resolve, ms));
const createThrottler = (rateLimit) => {
let requestTimestamp = 0;
return (requestHandler) => {
return async (...params) => {
const currentTimestamp = Math.floor(Date.now() / 1000);
if (currentTimestamp < requestTimestamp + rateLimit) {
await timer(rateLimit - (currentTimestamp - requestTimestamp))
}
requestTimestamp = Math.floor(Date.now() / 1000);
return await requestHandler(...params);
}
}
}
const throttle = createThrottler(2500);
const throttleFetch = throttle(fetch);
Edit2:我想知道是否有问题,我将这一行注释掉了:
const rateLimit = Math.floor((60/response.headers.get("X-Discogs-Ratelimit-Remaining")) * 1000);
所以我试着取消评论,但现在我明白了
Uncaught ReferenceError:
response
is not defined
Edit3:我得到了让 createThrottler()
函数正常工作的建议:-
const rateLimit = 2500;
const timer = ms => new Promise(resolve => setTimeout(resolve, ms));
const createThrottler = (rateLimit) => {
let requestTimestamp = 0;
return (requestHandler) => {
return async (...params) => {
const currentTimestamp = Number(Date.now());
if (currentTimestamp < requestTimestamp + rateLimit) {
const timeOut = rateLimit - (currentTimestamp - requestTimestamp);
requestTimestamp = Number(Date.now()) + timeOut;
await timer(timeOut)
}
requestTimestamp = Number(Date.now());
return await requestHandler(...params);
}
}
}
不能说我自己会解决这个问题,但我们做到了。所以现在我正在努力弄清楚如何以及在何处编码
const rateLimit = Math.floor((60 / response.headers.get("X-Discogs-Ratelimit-Remaining")) * 1000);
没有得到
Uncaught (in promise) ReferenceError: response is not defined
最佳答案
你看过去抖动了吗?
您可以像在任何定义的时间段内服务的 1 个调用一样对速率进行限制。将此视为量化。另一种方法是在延长的时间范围内对调用进行计数,然后无限期地或在定义的持续时间内阻止进一步的调用 - 这取决于您的首选用例。
通常,速率限制更多地与安全有关,第一个选项(在定义的时间段内服务一次调用)是恰当的。如果您为 Web API 执行此操作,您可能希望拒绝“过早”的请求,并使用适当的 HTTP 状态代码向请求者提供某种类型的反馈。
这里讨论了如何实现所有不同的选项:https://thoughtspile.github.io/2018/07/07/rate-limit-promises/
编辑:回应下面的 OP 评论并查看代码......我认为你想得太多了。
FWIW 我大部分时间都使用 debounce(相当于你的“ throttle ”),它的字面意思是 debounce(functionReference,timeoutInMilliseconds)。
代码是这样的
function debounce(func, waitFor) {
let timeout;
return (...args) => new Promise(resolve => {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(() => resolve(func(...args)), waitFor);
});
}
将您的 throttle(fetch)
更改为我的 debounce(fetch,2500)
应该就足够了。你不需要在该行上进行赋值操作,只需调用它,或者编写另一个名为 debouncedFetch
的函数来封装它,并在任何需要的地方调用它。
关于javascript - 如何使用主机提供的速率限制来限制我的 JS API 获取请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70595420/
我需要一次发送至少 200 条消息。程序启动后,给15或17发邮件成功,然后报错: 消息错误: com.sun.mail.smtp.SMTPSendFailedException: 421 4.4.2
我目前正在开发一个使用 AVSynthesizer 将文本转换为语音的 iOS 应用程序。 我想要做的是,当合成器在说话时,可以通过 slider 改变发声率,并且说话的速度会发生变化。 我在 sli
假设我们有以下场景: 包含 10,000 条消息的服务总线队列 Azure Functions(使用计划),其中函数设置为 SB 队列的触发器 外部(不受我们控制)系统无法超过特定请求率 如果我尽快对
TextToSpeech有设置语速的方法:setSpeechRate() .但它没有查询当前速度的相反方法。 有没有办法向系统查询该值? 最佳答案 您可能会得到默认的 TTS 语速 Settings.
我有一个关于 NGINX 速率限制的问题。 是否可以根据 JWT token 的解码值进行速率限制?我在文档中找不到任何这样的信息。 或者即使有一种通过创建纯自定义变量(使用 LuaJIT)来进行速率
我有一个带有方向键和 2 个按钮的游戏 handle 。所有这些都是数字的(不是模拟的)。 我有一个处理他们的事件的程序: -(void)gamepadTick:(float)delta {
所以我需要在 OpenCV 中获取网络摄像头的 fps 速率。哪个功能可以做这样的事情? 最佳答案 int cvGetCaptureProperty( CvCapture* capture, int
我四处寻找 CURL 设置文件,但没有在/etc/中找到它,也没有在 curl 站点 ether 上找到太多... 所以基本上我想做的是设置 curl 可以上传的最大速度限制(无论它正在运行多少个实例
我有一个在 Atom 上运行的嵌入式 Linux 系统,这是一个足够新的 CPU,可以有一个不变的 TSC(时间戳计数器),内核在启动时测量其频率。我在自己的代码中使用 TSC 来保持时间(避免内核调
我正在寻找一种以高粒度单独限制 RPC 速率的方法,令我沮丧的是,针对此问题可用的选项并不多。我正在尝试用 gRPC 替换 REST API,对我来说最重要的功能之一是能够为每个路由添加中间件。不幸的
我正在使用 PHP、MySQL 和 Redis 开发 API,并希望对特定调用进行速率限制。 API 位于 CloudFlare 后面。为实现这一点,我将增加每个 IP 地址每小时在 Redis 中进
我正在寻找一种以编程方式(无论是调用库还是独立程序)监视 linux 中实时 ip 流量的方法。我不想要总数,我想要当前正在使用的带宽。我正在寻找与 OS X 的 istat 菜单的网络流量监视器类似
所以我注意到 Apple 更改了 SKStoreProductViewController,禁用了“写评论”按钮。此问题是否有任何解决方法或修复方法? 最佳答案 SKStoreProductViewC
我今天浏览了 Amazon RDS 定价网站,现在确实想知道他们实际上如何计算 I/O 速率? “每 100 万个请求 0.10 美元”到底是什么意思? 谁能举出一些简单的例子,从 EC2 到 RDS
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 5 年前。 Improve
在旧的 API 中,剩余的允许容量显然作为 X-Ratelimit-Remaining 返回HTTP header 。 然而,current version's documentation对此一无所获
在我的 Android 应用程序中,我观察到前置摄像头录制的视频以 7-10 fps 的速度录制,而后置摄像头的工作正常, native 摄像头应用程序确实以 29fps 的速度录制前置摄像头的视频。
我正在编码一个里面有 dvb_teletext 的视频。打开输出流 #1:2 的编码器时出现错误提示。我使用以下命令对我的视频进行编码。 ffmpeg -threads 8 -i input.ts -
我正在使用以下命令为我的视频添加淡入淡出效果 {"-y", "-ss", "" + startMs / 1000, "-t", "" + (endMs - startMs) / 1000, "-i",
我正在尝试使用以下命令通过 FFMPEG 将 avi 视频文件转换为 flv 格式: -i C:\files\input\test.avi -y -ab 448k -ar 48000 -vcodec
我是一名优秀的程序员,十分优秀!