javascript - AJAX 冻结网页,并发出警告说浏览器变慢
问题描述
我正在利用 AJAX 调用向 Alpha Vantage API 发出请求,并在每次按键搜索时返回带有股票代码/股票代码数据的 JSON:
function edValueKeyPress() {
var keywords = document.getElementById("TextBox89").value;
if (keywords.length >= 2) {
var settings = {
"async": true,
"crossDomain": true,
"url": "https://www.alphavantage.co/query?function=SYMBOL_SEARCH&keywords=" + keywords + "&apikey=B8ARVH4ULKOPMDOT",
"method": "GET"
}
$.ajax(settings).done(function (response) {
var keywordsArray = [];
var json = response["bestMatches"];
for (var i = 0; i < json.length; i++) {
keywordsArray.push(json[i]["1. symbol"] + " - " + json[i]["2. name"]);
}
$("#TextBox89").autocomplete({
source: keywordsArray
});
});
}
}
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
Enter stock symbol/ticker: <input id="TextBox89" onKeyPress="edValueKeyPress()" onKeyUp="edValueKeyPress()">
正如您在我的代码片段中清楚地看到的那样,股票代码和公司名称是从该jqueryui autocomplete()
方法中提取的,并且可以正常工作。它也适用于这个 CodePen:https ://codepen.io/max-voisard/pen/jOPERRd 。
但是,当在我的网站上运行此网页时,它会导致页面在所有浏览器中无响应并冻结,并且仅有时会autocomplete()
响应并正常工作。我认为我的页面上必须有另一个脚本导致超时,但页面仅在输入文本框/搜索框时冻结。所以我认为 AJAX 有问题;要么它没有正确运行它的异步特性,要么它在 API 调用上用太多数据阻塞了网页的管道。
另外,我知道我不应该将我的 API 密钥放在 JavaScript 这样的客户端代码中,而应该放在服务器端代码中,但是很难以autocomplete()
这种方式实现方法。它也不是敏感的 API 密钥。
解决方案
由于这是对大量数据的请求,因此 AJAX 需要在浏览器设置的超时时间中有足够的时间来检索数据。简单地添加"timeout": 1000000
到 AJAX 调用对我来说就可以了。明白这一点:默认情况下,没有为 AJAX 调用设置超时!所以真的,你应该总是为 AJAX 调用设置超时 - 特别是对于批量数据请求 - 这个问题是可以避免的。另外,确保cache
设置为false
,因此不会分配太多内存。
$.ajax({
"timeout": 1000000,
"cache": false
});
推荐阅读
- reactjs - 在 ReactJS 中每 30 秒调用一次 API
- python - 使用 atan2 绘制等高线图的问题
- http - 无法在 ASP.NET Core 中调用 Web API 的 Patch 方法
- javascript - 如何在 React js 中的 div 上设置背景图像?
- python - 通过 USB-Stick 在外部“监视器”上运行 Python 动画?
- r - 在 R 中使用 `BTM` 和 `predict` 会输出 0.1 的统一主题概率
- python-3.x - networkx 中的边长标签没有很好地表示
- mysql - Docker 映像在 docker run 容器中运行良好,但在 swarm 中运行良好
- reactjs - IIS 服务器上的多语言反应应用程序不起作用
- list - 使用箭头浏览列表/更改小部件