相关文章推荐
打篮球的青椒  ·  【从Java到C#系列 ...·  2 年前    · 
坚强的玉米  ·  ConfigurationClassPost ...·  2 年前    · 
含蓄的电影票  ·  2022-08-01 ...·  2 年前    · 
文章介绍了在JavaScript中处理并发请求的两种方法:使用Promise.all进行批量请求并在所有请求完成后执行后续代码,以及利用forawait…of遍历异步可迭代对象进行逐个请求处理。推荐使用forawait…of,因为其语法简洁且易于维护。同时,文章提到了避免使用变量计数来同步异步操作的反模式。 摘要生成于 ,由 DeepSeek-R1 满血版支持,

1. Promise.all实现

Promise.all() 方法接收一个 promise 的 iterable 类型(注:Array,Map,Set 都属于 ES6 的 iterable 类型)的输入,并且只返回一个Promise实例,那个输入的所有 promise 的 resolve 回调的结果是一个数组。这个Promise的 resolve 回调执行是在所有输入的 promise 的 resolve 回调都结束,或者输入的 iterable 里没有 promise 了的时候。它的 reject 回调执行是,只要任何一个输入的 promise 的 reject 回调执行或者输入不合法的 promise 就会立即抛出错误,并且 reject 的是第一个抛出的错误信息。

伪代码如下
const pro = []
//一个列表循环
this.EarDataGrid.instance.getSelectedRowsData().forEach((item, index) => {
     // 取需要的数据
     const { BatchID, BatchName} = item
     let empty = {};
     empty['BatchID'] = BatchID //同步代码修改
     empty['BatchName'] = BatchName
     // 根据BatchID去请求xx接口,将请求合并用all请求
     pro.push(
         new Promise((res, rej) => {
             this.odataContext.bizBatchSetExpand.byKey(BatchID).then(r => {
                 res(r[0])
         }))
 });
 //根据刚刚push的all请求
Promise.all(pro).then((res) => {
	//在这就可以等所有的返回结果可以得到
	// do some thing...

2. for await…of实现(推荐)

这种方法是es6新语法,其介绍如下:

for await…of 语句创建一个循环,该循环遍历异步可迭代对象以及同步可迭代对象,包括:内置的 String, Array,类似数组对象 (例如 arguments 或 NodeList),TypedArray, Map, Set 和用户定义的异步/同步迭代器。它使用对象的每个不同属性的值调用要执行的语句来调用自定义迭代钩子。
类似于 await 运算符一样,该语句只能在一个async function 内部使用。

for…of 针对可迭代对象身上的(array, map, set, string, typedarray, argements)
迭代的是对象列表中的值(value) ,一般情况遍历数组

for…in 针对对象的属性进行无序遍历,除了symbol类的属性
遍历的是属性,一般情况适用于对象遍历

该方法使用起来,相比Promise.all要简洁的多,十分好用

代码示例如下:

/**根据批次调健康管理接口 */
async handleHealthApi() {
  // 使用for await...of实现处理异步操作
  for await (let item of this.batchList) {
    let params = `?$filter=BatchID eq '${item.BatchId}'&$orderby=ImmunityDate`;
    let { value } = await immtipApi.ImmunityPromptBatch(params)
   	// do some thing...

这种方法不推荐,很不推荐,建议优先使用官方推出的语法,这种写法会产生没必要的if,维护起来会越来越麻烦。

list.forEach(function (item, i) {
    setTimeout(() => {
        //模拟异步回调中
        count++;
        console.log('执行请求ing');
        //执行完所有异步操作
        if (count === list.length) {
            console.log(' 请求执行完成✅',)
            // do some thing...
    }, i)

觉得有用 点个赞吧

for循环中,想写一个异步请求数据的函数。因为异步的原因,循环完之后,请求数据只请求for循环的最后一次,无法实现每次循环都调用一次数据请求。 但是本框架采用的是axios,也并未找到把异步请求改成同步的方法。所以采用递归的方式来实现。 (function loop(index) { getLists({ province_id:id }).then(res =>...
今天遇到一个需求就是,需要在for循环中,进行axios异步请求。一般这个这个时候就遇到两个问题 因为你的请求是在for循环中,而且又是异步请求所以,请求出来的数据顺序错乱 还有就是在for里 等所有的异步请求完成之后,再去处理数据。这时你就会发现。它是先走了异步请求下边的代码,因为这个是线程问题,在一个就是异步的,它不会等着你完成请求之后再去执行。因为JS运行在浏览器中,是单线程的 for (let i = 0; i < 5; i++) { setTimeout(function() {
给大家整理了一些有关【For循环,线程】的项目学习资料(附讲解~~):https://edu.51cto.com/course/29338.htmlhttps://edu.51cto.com/course/31877.htmlJava 中的 for 循环异步任务 在现代编程中,异步编程是一种非常重要的编程模式。它有助...
问题描述:当我们使用for循环时,里面执行异步操作(比如延时器,接口请求等等),就会出现里面执行的永远是最后一次循环的结果,原因是因为for循环是同步的,当异步操作还没走完,for循环已经全部执行完成了,所以得到的永远是最后一次的结果。 解决办法1(闭包): 通过闭包来保存每次循环执行状态 for (var i = 0; i < 5; i++) { (function(a){ setTimeout(function(){ console.log
systemVersion: '/40001/0/27003', boardName: '/40001/0/27004', bspVersion: '/40001/0/27007' getDeviceBspInfo(){ let i=0 let bsplen...
数据集相关视频讲解:AIGC与NLP大模型实战-经典CV与NLP大模型及其下游应用任务实现还百度上搜数据集吗?记住这个地方啥数据都有!实现Java for循环里的异步操作指南 作为一名经验丰富的开发者,我们经常会遇到需要在for循环中进行异步操作的情况。这样的操作可以提高效率,但对于刚入行的小白来说可能会有一定的...