当前位置: 首页 > 面试题库 >

使用JQuery在循环中在Ajax请求之前发出警报

汪皓
2023-03-14
问题内容

我正在尝试创建一个循环,该循环在执行同步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调用

似乎由于某种原因,所有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