添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

开发中经常遇到,遍历去查询服务获取数据,并且后边的代码需要借用上边查询到的数据,但是查询服务是一个异步操作,运用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();
一、背景 开发中经常遇到,遍历去查询服务获取数据,并且后边的代码需要借用上边查询到的数据,但是查询服务是一个异步操作,运用forEach或者map循环,在还没有查询到数据后,就执行了下一步操作,所以以下有几种方法可以实现异步变同步二、问题1、首先举个例子,执行test函数,要求先输出1、2、3、4、5,然后再输出“next”let arr=[1,2,3,4,5];fu... ## 题库模块 系统中包含丰富的 Java 面试题库,用户可以根据自己的需求选择不同难度的题目进行答题。题目分为单选题、多选题、判断题等类型,系统还提供了题目分类、题目搜索等功能,方便用户快速找到自己需要的题目。 ## 答题模块 用户可以进行答题,系统会根据用户的答题情况进行评分,并记录用户的答题历史。同时,系统还提供了答题时间、答题次数等统计功能,帮助用户了解自己的答题情况。 ## 错题本模块 系统会根据用户答题情况记录用户的错题,并提供查看错题、删除错题等功能。用户可以根据自己的需要进行错题复习,提高自己的编程能力。 ## 答题排行榜模块 系统会根据用户的答题情况进行排名,并提供排行榜功能,用户可以在排行榜上看到自己的排名和其他用户的排名,与其他用户进行比较,提高自己的竞争力。 1、cardRearder中的promise方法,并返回结果。 2、getRetApdus中for循环处理cardRearder的结果res。(要等待所有的结果返回,使用传统for方法)(forEach相当于一部函数) 3、nfcReadCard请求处理getRetApdus的结果(nfcReadCard请求中的async 要放在res前面 ,否则会报await is a reserved word)。 结果:console.log(".
for循环数组调用同一接口传入不同 id 获取数据,改装数组实现需求。由于接口比较特殊,同时多次调用不稳定,for循环调接口会异步执行会报错,所以需要等待上一个请求完成再执行下一次请求,可以采用 for循环 + promise + async await 实现。使用定时器模拟请求: 打印结果:...
JavaScript中for of循环和普通循环的区别 假设现在有一个数组array,我们常用的for循环是以下这种 for(let i=0; i<array.length; i+){} 另外我们还可以用for of来循环数组中的value for(let c of array){} 以前我一直认为这两种循环方式没有什么区别,都可以帮助我通过循环逐个拿到想要的value从而进行后续的循环...
原生JS的入口函数是在所有的文件资源加载完成后, 才执行。这些文件资源包括:页面文档、外部的JS文件、外部的CSS文件、图片等。for循环也是在加载完成之前就执行好的。 for循环同步异步问题案列代码如下: <!DOCTYPE html> <html lang="en"> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge
forEach同/异步问题一、forEach外部等待forEach执行完成二、forEach内部等待异步执行完成三、既需要forEach内部同步执行,又需要forEach外部同步执行 一、forEach外部等待forEach执行完成 let arr = [1, 2, 3, 4, 5, 6, 7]; let arr2 = []; arr.forEach((item) => { setTimeout(() => { arr2.push(item); }, 1000);
在 JavaScript 中,`forEach`、`for...of`、`for...in` 循环是不支持跳出循环的。因为它们是迭代器循环,无法使用 `break` 或 `continue` 语句跳出循环。 但是,可以使用 `some`、`every`、`find`、`findIndex` 等数组方法来实现跳出循环的效果。例如: 1. 使用 `some` 方法: const arr = [1, 2, 3, 4, 5]; arr.some(item => { console.log(item); if (item === 3) { return true; // 跳出循环 2. 使用 `find` 方法: const arr = [1, 2, 3, 4, 5]; arr.find(item => { console.log(item); if (item === 3) { return true; // 跳出循环 3. 使用 `for` 循环: const arr = [1, 2, 3, 4, 5]; for (let i = 0; i < arr.length; i++) { console.log(arr[i]); if (arr[i] === 3) { break; // 跳出循环 需要注意的是,以上方法只适用于数组类型。对于其他类型的迭代器循环,可以使用 `return` 语句实现跳出循环的效果。