我正在尝试创建一个循环,该循环在执行同步ajax请求之前要求用户进行确认,并且此命令无法按顺序工作。这是我的代码:
<script>
$(document ).ready(function() {
for(var i = 0; i < 3; i++) {
alert("iteration "+i);
$(".demo").easyOverlay("start");
$.ajax({
async: false,
url: "http://rest-service.guides.spring.io/greeting"
}).then(function(data) {
$('.demo').append(data.id);
$('.demo').append(data.content);
$(".demo").easyOverlay("stop");
});
}
});
</script>
我的代码所具有的行为是这样的:
似乎由于某种原因,所有ajax调用都被延迟,直到所有警报都被确认为止,而我不知道为什么。我试图在不使用循环的情况下实现我的相同目标,并且通过重复执行3次代码,得到了完全相同的奇怪行为。
编辑:
如果我在’then()’中添加以下行以检查html是否确实被修改,我可以在控制台中看到这些事情实际上是按顺序发生的,直到我确认每个警报后它们才出现在浏览器中,这就是这给人的印象是执行顺序不正确。因此,我需要弄清楚为什么反射对html所做的更改会延迟并且无法立即完成。
console.log($('.demo').html());
IMO jQuery.Deferred()
目标将是最有希望的方式。
Deferred对象是chainable utility
通过调用jQuery.Deferred()方法创建的对象。它可以将多个回调注册到回调队列中,调用回调队列,并中继任何同步或异步功能的成功或失败状态。
deferred objects
可用于处理异步事件-您启动一个动作,然后注册一个回调,该回调将在动作完成时调用。这包括AJAX,尽管还有很多其他用途。
哪里要求解决
function callAjaxMethod(url, step) {
return $.Deferred(function() {
//Confirm box for use inputs
if(confirm(step))
{
//Ajax call
$.ajax(url).done(function(data){
//Do something
//Update your HTML if needed
});
}
setTimeout(function() {
//This will resolve your call again
this.resolve();
}.bind(this), 1000);
})
}
递延对象
var defer = $.Deferred().resolve();
var counters = [1, 2, 3, 4, 5];
$.each(counters, function(key, value) {
defer = defer.then(function() {
return callAjaxMethod('URL', value);
});
});
完成后它将调用
defer.then(function() {
//It will call when all done
});
很少的文档
官方jQuery.Deferred
通过jQuery
deferred的调用ajax
关于多个jQuery Promise的文章
希望这对您有帮助:)
var $demo = $('#demo');
var ajaxURL = 'https://jsonplaceholder.typicode.com/posts';
function callAjaxMethod(url, step) {
return $.Deferred(function() {
//Confirm box for user inputs
if(confirm(step))
{
//Ajax call
$.ajax(url).done(function(data){
//Do something
//console.log(data);
//Update the HTML OK
$demo.append(step + ": Success" + "<br/>");
});
}
else
{
//Update the HTML when cancel
$demo.append("<font color='red'>"+ step +": Cancelled </font>" + "<br/>");
}
//Use timeout to get the resolved
setTimeout(function() {
this.resolve();
}.bind(this), 1000);
})
}
//Defer object
var defer = $.Deferred().resolve();
var counters = ['call 1', 'call 2', 'call 3', 'call 4', 'call 5'];
//Loop your calls
$.each(counters, function(key, value) {
defer = defer.then(function() {
return callAjaxMethod(ajaxURL, value);
});
});
defer.then(function() {
//It will call when all done
$(demo).append("<br/><br/>"+"ALL DONE");
});
div
{
color: blue;
font-size: 14px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="demo"></div>
问题内容: 我试图在带有Razor的MVC 4中使用$ .ajax发出AJAX请求。我不确定如何实现它。 使用此视频,我能够成功进行返回数据的链接驱动的调用,但是我似乎无法在jquery函数中执行相同的操作。我似乎找不到如何执行此操作的任何基本示例。这就是我正在使用的: HomeController.cs View.cshtml 问题答案: 您只需要使其成为一个。另外,如果您使用的是Ajax PO
问题内容: 如何使用jQuery明确提出AJAX HTTPS GET请求?我正在尝试执行以下操作。在https页面上,我有一行代码,但是出现以下错误 如果相对资源来自https页面,为什么AJAX调用会尝试使用HTTP协议访问页面?如果$ .get(url)方法默认执行此操作,那么我如何使用jQuery进行显式的HTTPS GET请求?在http://forum.jquery.com/topic/
第一次: Hackerrank抛出错误,因为不是函数。我还尝试了和,但都无济于事。 我尝试了:
问题内容: 我想知道为什么当我这样依次调用request.get()方法时: 我对所有请求的状态都良好,但是当我在for循环中执行该状态时,例如: 除最后一个请求外,所有请求我都得到400(错误)。 附加信息:SO上有一个相关的问题,其中提到了两种应对这种情况的方法:等待,标题。 在我的情况下 以及标题中,wait不起作用-我不知道在那里提供了什么。 更新:我正在尝试实现的特定版本: 问题答案:
问题内容: 我在我的网站上做了一些非常基本的jQuery ajax的工作,并且遇到了很多麻烦。 以下是相关代码: 该页面是通过HTTPS加载的,但是XMLHttpRequests似乎是通过HTTP输出的。 我甚至尝试将URL更改为绝对URL(https://larsendt.com/jsontest/randomdata),它 仍然 将请求发送到我的站点的HTTP版本。 自然,由于请求将转到其他协
问题内容: 是否有可能使用jQuery 取消/中止尚未收到响应的Ajax请求? 问题答案: 大多数jQuery Ajax方法都返回XMLHttpRequest(或等效的)对象,因此您可以使用abort()。 请参阅文档: 中止方法 (MSDN)。取消当前的HTTP请求。 abort()(MDN)。如果请求已经发送,则此方法将中止请求。 更新: 从jQuery 1.5开始,返回的对象是名为jqXHR