forEach、map、for..of、for..in、for循环实现异步变同步的问题

一、背景

      开发中经常遇到,遍历去查询服务获取数据,并且后边的代码需要借用上边查询到的数据,但是查询服务是一个异步操作,运用forEach或者map循环,在还没有查询到数据后,就执行了下一步操作,所以以下有几种方法可以实现异步变同步

二、问题

1、首先举个例子,执行test函数,要求先输出1、2、3、4、5,然后再输出“next”

let arr=[1,2,3,4,5];
function asyncEvent(ele){
    setTimeout(e=>{
      console.log(e);
    },500,ele);
}
function test(){
	arr.map( ele=> asyncEvent(ele));
  	console.log("next");
}
test();

2、从动画中可以看出,是先执行“next”,再执行数字,并且数字是同时展示出来的

三、解决方案

1、实现同步的方法

      将要执行的异步方法封装成一个Promise返回,运用async/await方法,当异步函数里执行resolve时,await接收到成功的指示,然后进行下一步,实现结果如下

首先将异步函数用用Promise封装一下, 然后调用的时候用await去调用

let arr=[1,2,3,4,5];
function asyncEvent(ele){
    return new Promise(resolve=>{
    	setTimeout(e=>{
      		console.log(e);
      		resolve(e)
    },1000,ele);
  })
}

a、for...of...

async function test(){
	for(let i of arr){
    	    await asyncEvent(i);
  	}
  	console.log("next");
}
test();

b、for ()循环

async function test(){
	for(let i=0;i<arr.length;i++){
   	     await asyncEvent(arr[i]);
        }
  	console.log("next");
}
test();

c、for...in...

async function test(){
	 for(let i in arr){
    	   await asyncEvent(arr[i]);
  	  }
  	console.log("next");
}
test();

d、while(){}

async function test(){
	let len=arr.length;
  	while(len--){
    	    await asyncEvent(arr[len]);
  	}
  	console.log("next");
}
test();

e、Promise.all()

    用这个方法,需要将接下来进行的操作放在then中执行,Promise.all会将几个异步操作并列执行,最终执行完成后的结果放在res中

async function test(){
	  Promise.all(arr.map( async ele=>{
            return await asyncEvent(ele); 
      })).then(res=>{
    		    console.log(res)
    		    console.log("is start");
  		});
}
test();

2、不能实现同步的方法(以下方法实现不了,仅做错误实例)

a、forEach()

async function test(){
	arr.forEach(async ele=> await asyncEvent(ele));
        console.log("next");
}
test();

b、map()

async function test(){
	arr.map(async ele=> await asyncEvent(ele));
        console.log("next");
}
test();

 

  • 10
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
好的,我会依次回答你的三个问题。 1. React中的事件合成机制是指React将浏览器原生事件封装成一个合成事件对象,这样可以屏蔽浏览器兼容性和性能问题。React使用了事件委托的方式处理事件,将所有事件添加到document上,然后通过冒泡机制从目标元素一直到document,寻找最合适的元素来处理事件。React事件合成机制的好处是可以提高性能,减少内存占用,同时也方便了开发者的使用。 2. Mapforeach、for...of的区别如下: - Map:返回一个新数组,数组中的元素为原数组元素调用函数处理后的值。 - foreach:没有返回值,只是对原数组进行遍历操作,并执行回调函数。 - for...of:遍历可迭代对象,例如数组、字符串、Map等。每次迭代返回一个元素的值。 3. 组件之间如何自定义实现一个v-model? 在React中,v-model可以理解为一个双向绑定的语法糖,可以通过props将组件状态传递给父组件,再由父组件修改状态,然后通过props将修改后的值传递回子组件。 实现步骤如下: 1. 在子组件中定义一个value属性和一个onChange事件处理函数。 2. 在父组件中定义一个handleValueChange函数,用于修改value的值。 3. 在父组件中通过props将handleValueChange函数和value的值传递给子组件。 4. 在子组件中绑定value属性和onChange事件处理函数,当value值改时,调用onChange事件处理函数,并将新的value值传递给父组件的handleValueChange函数。 示例代码如下: ```jsx // 子组件 function ChildComponent(props) { return ( <div> <input value={props.value} onChange={props.onChange} /> </div> ); } // 父组件 function ParentComponent() { const [value, setValue] = useState(''); const handleValueChange = (newValue) => { setValue(newValue); }; return ( <div> <ChildComponent value={value} onChange={(e) => handleValueChange(e.target.value)} /> </div> ); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值