首页 > 其他分享 >jQuery.when的使用

jQuery.when的使用

时间:2023-05-25 16:22:19浏览次数:40  
标签:jQuery function 调用 when 接口 currentPosition 合同 使用 var

需求:有1000个合同,每次并发处理2个合同(单独对每个合同调用WebAPI接口),每次确保2个合同被处理完毕后等待1秒再继续处理后面2个。

// 1000个合同的数组
var contracts = [...];

// 记录当前处理的合同位置
var currentPosition = 0;

// 处理两个合同并调用Web API接口
function processContracts() {
  // 取出两个合同
  var contract1 = contracts[currentPosition];
  var contract2 = contracts[currentPosition + 1];

  // 分别处理两个合同的接口调用
  var contract1Ajax = $.ajax({
    url: "yourWebAPIUrl",
    method: "POST",
    data: { contractData: contract1 }
  });

  var contract2Ajax = $.ajax({
    url: "yourWebAPIUrl",
    method: "POST",
    data: { contractData: contract2 }
  });

  // 等待两个接口调用都完成后,再处理下两个合同
  $.when(contract1Ajax, contract2Ajax).then(function(contract1Result, contract2Result) {
    // 处理合同1的接口调用结果
    console.log("合同1的接口调用结果:" + contract1Result);
    // 处理合同2的接口调用结果
    console.log("合同2的接口调用结果:" + contract2Result);

    // 延迟1秒后,处理下两个合同
    setTimeout(function() {
      currentPosition += 2;
      if (currentPosition < contracts.length) {
        processContracts();
      }
    }, 1000);
  });
}

// 开始处理合同
processContracts();

在这个代码中,我们首先使用 $.ajax 函数分别调用了两个合同的 Web API 接口。由于这两个接口是并行调用的,因此需要使用 $.when 函数来等待两个接口都执行完成后再处理下两个合同的接口调用。

当两个接口调用都成功完成后,$.when 函数会执行 then 函数里的回调函数,我们可以在该函数中处理两个接口调用的结果。处理完成后,会先等待 1 秒,再更新 currentPosition 的值,递归调用 processContracts() 函数处理下两个合同的接口调用。如果所有合同的接口调用都完成了,则递归调用结束。

另一种方式:异步队列

// 1000个合同的数组
var contracts = [...];

// 记录当前处理的合同位置
var currentPosition = 0;

$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
  options.async = true;
  options.queue = 'asyncRequests';
});

$.xhrPool = [];
$.xhrPool.abortAll = function () {
  $(this).each(function (idx, jqXHR) {
    jqXHR.abort();
  });
  $.xhrPool.length = 0;
};

$(document).ajaxComplete(function (event, jqXHR, options) {
  var index = $.xhrPool.indexOf(jqXHR);
  if (index > -1) {
    $.xhrPool.splice(index, 1);
  }
});

$(document).ajaxError(function (event, jqXHR, settings, thrownError) {
  if (thrownError !== 'abort') {
    alert('An error occurred while making the ajax request.');
  }
});

function processContracts() {
  var contract1 = contracts[currentPosition];
  var contract2 = contracts[currentPosition + 1];

  var contract1Ajax = $.ajax({
    url: "yourWebAPIUrl",
    method: "POST",
    data: { contractData: contract1 }
  });

  var contract2Ajax = $.ajax({
    url: "yourWebAPIUrl",
    method: "POST",
    data: { contractData: contract2 }
  });

  // 添加 ajax 请求到队列中
  $.xhrPool.push(contract1Ajax);
  $.xhrPool.push(contract2Ajax);

  // 等待两个接口调用都完成后,再处理下两个合同
  $.when(contract1Ajax, contract2Ajax).then(function(contract1Result, contract2Result) {
    // 处理合同1的接口调用结果
    console.log("合同1的接口调用结果:" + contract1Result);
    // 处理合同2的接口调用结果
    console.log("合同2的接口调用结果:" + contract2Result);

    // 延迟1秒后,处理下两个合同
    setTimeout(function() {
      currentPosition += 2;
      if (currentPosition < contracts.length) {
        processContracts();
      }
    }, 1000);
  });
}

// 设置最大并发数
$(document).queue('asyncRequests', function () {
  $.when(processContracts())
    .always(function () {
      $(document).dequeue('asyncRequests');
    });
});

// 开始处理合同
processContracts();

标签:jQuery,function,调用,when,接口,currentPosition,合同,使用,var
From: https://www.cnblogs.com/Ceri/p/17431692.html

相关文章

  • When you...
    lately,IspentsomuchtimeonEnglish,expeciallyIELTS.IalsospenttimeonJapanese,thoughtIdon'tknowwhy.....MaybeIjustdon'ttogiveupit,afterall,Ihavesutdieditaterm....   Today,Ireadabeautifulpakeage,Ipublishi......
  • 使用lsyncd实时同步文件从一台服务器到另一台服务器
    一背景说明我有3台nginx服务器,想实时同步vhost,html,ssl这三个目录,这样我只是改一台机器的东西,所有服务器上的配置文件也都会被更改,就找到了lsyncd的同步软件,是通过lsyncd结合ssh去实现实时同步的,我这里是想把196上面的3个目录,同步到198和197上.系统:centos7.9lsyncd版本:2......
  • grep -A -B -C使用介绍
    grep-A显示匹配指定内容及之后的n行grep-B 显示匹配指定内容及之前的n行grep-C 显示匹配指定内容及其前后各n行 grep-A5nametest.txt搜索匹配test.txt文件中与”name”字符串匹配的行,并显示其后的5行......
  • python中islice()函数使用
    islice是Python中的一个函数,用于对可迭代对象进行切片操作,可以实现类似于切片操作一样的功能,但又不像切片那样需要先将整个序列读入内存,从而节省内存。islice函数是通过生成器来实现对可迭代对象的切片,从而避免了将整个序列读入内存的限制,可以节省大量的内存。使用islice函数需要......
  • 【Git】git详细使用说明教程
    以下是汇总别人网上写好的,在这里记录一下,方便以后使用权威Git书籍 ProGit(中文版)git官网:http://git-scm.comgit手册:Git-Reference网友整理的Git@osc教程,请点击这里;一份很好的Git入门教程,请点击这里;Git图解教程Git视频教程:Git版本控制器_张果_哔哩哔哩_bilibili一个......
  • 网络灌包命令_iperf工作原理及使用方法
         网络性能评估主要是监测网络带宽的使用率,将网络带宽利用最大化是保证网络性能的基础,但是由于网络设计不合理、网络存在安全漏洞等原因,都会导致网络带宽利用率不高。要找到网络带宽利用率不高的原因,就需要对网络传输进行监控,此时就需要用到一些网络性能评估工具,而Ipe......
  • Fdog系列(三):使用腾讯云短信接口发送短信,数据库写入,部署到服务器,web收尾篇。
    文章目录1.前言2.使用腾讯云短信接口发送短信3.java连接数据库4.部署到服务器(如果你有的话)目录Fdog系列(一):思来想去,不如写一个聊天软件,那就从仿QQ注册页面开始吧。Fdog系列(二):html写完注册页面之后怎么办,用java写后台响应呀。文章中出现的源码获取方式:评论区留下邮箱地址。创作......
  • Centos 7 系统上使用dokcer安装oracle 11g(踩坑验证过可用)
    1.docker安装略2.查看docker中关于oracle11g的镜像,并拉下来dockersearchoracle_11gdockerpulldocker.io/akaiot/oracle_11g此处选择第二个 3.启动临时容器获取初始化数据dockerrun-d--nametest--restartunless-stopped\-p1521:1521docker.io/akaiot/o......
  • Guava cache使用总结
    importcom.google.common.cache.CacheBuilder;importcom.google.common.cache.CacheLoader;importcom.google.common.cache.LoadingCache;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Random;importjava.util.concurrent.TimeUnit;......
  • 创建及使用一个SqlServer的用户自定义表类型(User-Defined Table Type)
    创建一个用户自定义表类型(User-DefinedTableType)CREATETYPE[dbo].[MyTypeName]ASTABLE( [Field1][nvarchar](50)NOTNULL, [Field2][nvarchar](100)NULL, [Field3][nvarchar](50)NULL, [Field4][nvarchar](20)NULL, [Field5][nvarchar](20)NULL)GO直接......