当前位置: 首页 > 知识库问答 >
问题:

尝试使用延迟对象和$. time进行多个AJAX调用

经国安
2023-03-14

因此,根据本教程中关于介质的内容(https://medium.com/coding-design/writing-better-ajax-8ee4a7fb95f#.d7ymg99mp),我尝试使用延迟数组、ajax请求和jQuery.when方法生成多个ajax请求并从每个请求中获取结果。

这是我正在做的事情的代码

function updateAllGoingButtons(){
    var dataToPass = {};
    var deferreds = [];

    $('.btn-group').find('button').each(function(){
       console.log($(this).attr('id'));
       dataToPass.button = $(this).attr('id');
       var ajax = $.ajax({
          url: '/update-buttons',
          method: 'post',
          data: dataToPass,
          dataType:'json'
       });

       deferreds.push(ajax);

       $.when.apply($, deferreds).then(function(){

       });
    });
}

我对如何使用$.when函数以及在哪里可以访问返回到ajax调用的数据感到困惑。

我尝试插入一个简单的成功选项,但它没有进入回调函数。我该怎么做呢?

共有1个答案

陆飞龙
2023-03-14

你只是在太快的时候调用。在启动所有ajax调用并在数组中得到它们的promise后,在each循环之外执行此操作:

function updateAllGoingButtons(){
    var dataToPass = {};
    var deferreds = [];

    $('.btn-group').find('button').each(function(){
       console.log($(this).attr('id'));
       dataToPass.button = $(this).attr('id');
       var ajax = $.ajax({
          url: '/update-buttons',
          method: 'post',
          data: dataToPass,
          dataType:'json'
       });

       deferreds.push(ajax);

    });

    $.when.apply($, deferreds).then(function(){     // <=== Moved this
                                                    // <===
    });                                             // <===
}

这些ajax调用的结果将作为一系列离散参数提供给函数。每个参数将是一个包含三个条目的数组,对应于通常传递给success函数的三个参数。因为您处理的是数组,所以您可能希望通过参数伪数组访问它们。最好有一个拒绝处理程序(第二个参数是then,或者在jQuery的最新版本中交替使用catch):

$.when.apply($, deferreds).then(
    function() {
        var n;
        for (n = 0; n < arguments.length; ++n) {
             console.log("Result " + n, arguments[n][0]);
        }
    },
    function() {
        // At least one request failed
    }
);

 类似资料:
  • 我有一种情况,我的ajax调用必须以特定的顺序执行。我在其他情况下使用了jQueryDeferred对象,但似乎找不到一种方法来使其正常运行。 我有一个函数,在它的生命周期中执行许多请求。一些请求将在其他请求的成功回调期间执行。 我的问题:当调用时,是否有方法将所有嵌套的延迟对象返回到原始的

  • 问题内容: 我试图在加载器图标和​​成功的html之间添加一个小的延迟(2秒)。 我尝试使用的是setTimeout并放入延迟号。这是行不通的,所以我希望您能告诉我正确的方法是什么。 我的ajax代码: 现在,它运行得非常快。希望有人能帮忙。 问题答案: 应该用在里面 。

  • 问题内容: 有什么技巧可以基于Redis延迟任务执行(即计划)? 也许一些聪明的方法可以将BLPOP延迟给定的秒数? 问题答案: 您可以使用名称中带有时间成分的多个LIST环。作为时间成分,您可以采用当前秒(0-59)。 您总是将任务添加到当前秒的列表中。要获得作业,请仅在保证内容早于给定秒数的那些列表上执行BLPOP(低超时)。 如果您在多个主机上工作,则必须注意时钟是同步的(NTP)。

  • 问题内容: 我有一些已经在使用的JBoss webapp,还有一个懒惰的初始化问题。因此,建议我在Spring进行调查并使用。 但是,我仍然会收到错误消息,希望您能对我有所帮助?要使用Spring OEM过滤器,我还需要在应用程序中进行哪些更改? 我的设置是这样的: + jsf的东西。 我将其设置如下:web.xml applicationContext.xml: persistence.xml:

  • 我有搜索栏(文本字段)组件,它会根据用户类型更新列表。问题是,对于用户输入的每个字符,列表都会更新,因此如果他们想写入,列表会更改11次!我需要做一些延迟函数(updateList)调用的事情,比如说让它每1秒调用一次,即使它在一秒钟内被调用了很多次。任何建议。

  • 延迟调用一个函数,直到当前调用堆栈已经清除。 使用 setTimeout() ,超时时间为1ms,将新事件添加到浏览器事件队列,并允许渲染引擎完成其工作。使用展开 (...) 运算符为函数提供任意数量的参数。 const defer = (fn, ...args) => setTimeout(fn, 1, ...args); // Example A: defer(console.log, 'a