作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个像下面这样的文本区域:
<textarea name="mailist" id="mailist" placeholder="email@domain.com"></textarea>
我想从邮件列表发出请求,并使用 "split"和 "foreach"将数据(每行电子邮件)发送到某个 URL。它成功了。
但问题是,当我点击提交按钮时,所有请求同时发送。我怎样才能做到:
对方结束后发送请求
异步发起请求
不卡住浏览器
最佳答案
您正在寻找的是promise
。 jQuery 中的每个 $.ajax
函数都会返回一个 promise
。您可以阅读 documentation here获取更多详细信息。要点是,返回的 promise 公开了一个名为 then
的函数,该函数可用于以您希望的方式一个接一个地链接请求。
考虑这种 ajax 请求
var request = $.ajax({
method: 'get',
url: 'www.google.com'
});
因为它是异步运行的,所以你需要注册处理程序来让你知道请求何时成功完成,或者失败,就像这样
request.then(
function successHandler(response) {
/* The first function will be called if the request is successful */
},
function failureHandler(response) {
/* The second function will be called if the request fails */
}
);
使用此模式,您可以等待请求成功或失败,然后再继续下一个请求。
完整保留前面的代码部分
您需要实现一个排序队列。大多数浏览器都有大约 2-5 个并发请求的合理限制。一个例子是
var emailAddresses = [/* a list email addresses */];
var MAX_SIMULTANEOUS_REQUESTS = 4;
var CURRENT_REQUESTS = [];
function runRequests(emailAddresses, max, running) {
while(running.length < max) {
running.push(createRequest(emailAddress.pop(), running));
}
return emailAddresses.length;
}
function createRequest(emailAddress, running) {
var request = /* Creates requests in some manner */;
request
.then(
function() {
/* Remove this request from the list of running requests */
var indexOfRequest = running.indexOf(request);
running.splice(indexOfRequest, 1);
},
function() {
/* For extra points, add this to a retry queue */
}
);
return request;
}
/* Usage */
var interval = setInterval(function() {
var remaining = runRequests(emailAddresses, MAX_SIMULTANEOUS_REQUESTS, CURRENT_REQUESTS);
if (remaining === 0) {
clearInterval(interval);
}
}, 500);
关于javascript - AJAX - 如何在不卡住浏览器的情况下一个一个地发出异步请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36332123/
我是一名优秀的程序员,十分优秀!