JavaScript循环中如何使用 async/await?需要注意些什么?
为什么会发生这种情况?
使用map返回一个promise 数组
const fruitBasket = { apple: 27, grape: 0, pear: 14 };你想从fruitBasket获得每个水果的数量。 要获取水果的数量,可以使用getNumFruit函数。
const control = async _ => { console.log('Start') const numApples = await getNumFruit('apple'); console.log(numApples); const numGrapes = await getNumFruit('grape'); console.log(numGrapes); const numPears = await getNumFruit('pear'); console.log(numPears); console.log('End') }
如果你想连续执行await调用,请使用for循环(或任何没有回调的循环)。
准备一个例子对于这篇文章,假设你想从水果篮中获取水果的数量。
const reduceLoop = async _ => { console.log('Start'); const sum = await fruitsToGet.reduce(async (promisedSum, fruit) => { const numFruit = await fruitBasket[fruit]; const sum = await promisedSum; return sum + numFruit; }, 0) console.log(sum) console.log('End') }
有一种方法可以加速reduce循环,如果你在等待promisedSum之前先等待getNumFruits(),那么reduceLoop只需要一秒钟即可完成:
const forLoop = async _ => { console.log('Start'); for (let index = 0; index < fruitsToGet.length; index++) { // 得到每个水果的数量 } console.log('End') }在for循环中,过上使用getNumFruit来获取每个水果的数量,并将数量打印到控制台。
}const filterLoop = _ => { console.log('Start') const moreThan20 = fruitsToGet.filter(async fruit => { const numFruit = await fruitBasket[fruit] return numFruit > 20 }) console.log(moreThan20) console.log('END') }运行结果
const mapLoop = _ => { // ... const promises = fruitsToGet.map(async fruit => { const numFruit = await getNumFruit(fruit); return numFruit + 100 }) // ... } “Start”; “[127, 100, 114]”; “End”;在 filter 循环中使用 await当你使用filter时,希望筛选具有特定结果的数组。假设过滤数量大于20的数组。
const reduceLoop = _ => { console.log('Start'); const sum = fruitsToGet.reduce((sum, fruit) => { const numFruit = fruitBasket[fruit]; return sum + numFruit; }, 0) console.log(sum) console.log('End') }运行结果:
const promises = fruitsToGet.map(getNumFruit);
在第二次遍历中,sum是一个promise。 (为什么?因为异步函数总是返回promises!)numFruit是0.promise 无法正常添加到对象,因此JavaScript将其转换为[object Promise]字符串。 [object Promise] + 0 是object Promise] 0。
‘Start’ ‘End’ ‘27’ ‘0’ ‘14’
最后,假设你想使用await和getNumFruit来获取异步函数中每个水果的数量。
const forLoop = async _ => { console.log('start'); for (let index = 0; index < fruitsToGet.length; index ++) { const fruit = fruitsToGet[index]; const numFruit = await getNumFruit(fruit); console.log(numFruit); } console.log('End') }当使用await时,希望JavaScript暂停执行,直到等待 promise 返回处理结果。这意味着for循环中的await 应该按顺序执行。


但实际结果是不同的。在forEach循环中等待返回结果之前,JavaScrip先执行了 console.log('End')。
原文地址:https://medium.com/free-code-camp/javascript-async-and-await-in-loops-30ecc5fb3939
在 reduce 循环中使用 await如果想要计算 fruitBastet中的水果总数。 通常,你可以使用reduce循环遍历数组并将数字相加。
在reduce中使用wait最简单(也是最有效)的方法是
这个版本易于阅读和理解,需要一秒钟来计算水果总数。
使用 filter 对返回的结果进行处理
更多编程相关知识,请访问:编程学习网站!!
以上就是JavaScript循环中如何使用 async/await?需要注意些什么?的详细内容,更多请关注聚合云库其它相关文章!
解开谜团!
使用 await 等待处理结果
const fruitsToGet = [“apple”, “grape”, “pear”];循环遍历这个数组:
这种行为适用于大多数循环(比如while和for-of循环)…
[object Promise]14 是什么 鬼??
不要在 filter 和 reduce 中使用 await,如果需要,先用 map 进一步骤处理,然后在使用 filter 和 reduce 进行处理。
这是因为reduce可以在等待循环的下一个迭代之前触发所有三个getNumFruit promise。然而,这个方法有点令人困惑,因为你必须注意等待的顺序。
结果正如你所预料的那样。
如果你正常使用filter (没有 await),如下:
在第三次遍历中,sum 也是一个promise。 numFruit是14. [object Promise] + 14是[object Promise] 14。
在第一次遍历中,sum为0。numFruit是27(通过getNumFruit(apple)的得到的值),0 + 27 = 27。
在 for 循环中使用 await首先定义一个存放水果的数组:

如果在map中使用await, map 始终返回promise数组,这是因为异步函数总是返回promise。
但是它不能处理需要回调的循环,如forEach、map、filter和reduce。在接下来的几节中,我们将研究await 如何影响forEach、map和filter。
const getNumFruit = fruit => { return fruitBasket[fruit]; }; const numApples = getNumFruit('apple'); console.log(numApples); //27现在,假设fruitBasket是从服务器上获取,这里我们使用 setTimeout 来模拟。
const forEach = _ => { console.log('start'); fruitsToGet.forEach(fruit => { //... }) console.log('End') }接下来,我们将尝试使用getNumFruit获取水果数量。 (注意回调函数中的async关键字。我们需要这个async关键字,因为await在回调函数中)。
Start ["apple"] ENDfilter 中的await不会以相同的方式工作。 事实上,它根本不起作用。
这意味着,你可以在reduce回调中使用await,但是你必须记住先等待累加器!
使用 reduce 对返回的结果进行处理
const reduceLoop = async _ => {
const filtered = array.filter(true);
在filter使用 await 正确的三个步骤
当你在 reduce 中使用await时,结果会变得非常混乱。
但是从上图中看到的那样,await 操作都需要很长时间。 发生这种情况是因为reduceLoop需要等待每次遍历完成promisedSum。
剖析这一点很有趣。
“Start”; “Apple: 27”; “Grape: 0”; “Pear: 14”; “End”;

首先,使用 forEach 对数组进行遍历。
实际控制台打印如下:
在本文中,分享一些在如果循环中使用await值得注意的问题。
当在filter 回调中使用await时,回调总是一个promise。由于promise 总是真的,数组中的所有项都通过filter 。在filter 使用 await类以下这段代码
如果你愿意,可以在promise 中处理返回值,解析后的将是返回的值。


JavaScript 中的 forEach不支持 promise 感知,也支持 async 和await,所以不能在 forEach 使用 await 。
console.log('Start');const forEachLoop = _ => { console.log('Start'); fruitsToGet.forEach(async fruit => { const numFruit = await getNumFruit(fruit); console.log(numFruit) }); console.log('End') }我期望控制台打印以下内容:
const numFruits = await Promise.all(promises);使用 await 等待处理结果
const reduceLoop = async _ => { console.log('Start'); const sum = await fruitsToGet.reduce(async (promisedSum, fruit) => { const sum = await promisedSum; const numFruit = await fruitBasket[fruit]; return sum + numFruit; }, 0) console.log(sum) console.log('End') }
console.log(sum)
使用map返回一个promise 数组
const mapLoop = async _ => { console.log('Start'); const promises = fruitsToGet.map(async fruit => { const numFruit = await getNumFruit(fruit); return numFruit; }); const numFruits = await Promise.all(promises); console.log(numFruits); console.log('End') }运行结果如下:
const reduceLoop = async _ => { console.log('Start'); const sum = await fruitsToGet.reduce(async (sum, fruit) => { const numFruit = await fruitBasket[fruit]; return sum + numFruit; }, 0) console.log(sum) console.log('End') }
async 与 await 的使用方式相对简单。 但当你尝试在循环中使用await时,事情就会变得复杂一些。
console.log('End')const sum = numFruits.reduce((sum, fruit) => sum + fruit);
永远不要和forEach一起使用await,而是使用for循环(或任何没有回调的循环)。
由于getNumFruit返回一个promise,我们使用 await 来等待结果的返回并打印它。
如果你在 map 中使用 await,map 总是返回promises,你必须等待promises 数组得到处理。 或者通过await Promise.all(arrayOfPromises)来完成此操作。
const mapLoop = async _ => { console.log('Start') const numFruits = await fruitsToGet.map(async fruit => { const numFruit = await getNumFruit(fruit); return numFruit; }) console.log(numFruits); console.log('End') } “Start”; “[Promise, Promise, Promise]”; “End”;
相关热词: javascript
本站内容来源于网络,如有侵权请与我们联系,我们会及时删除,我们深感抱歉!
注:本站所有信息仅供用于网络技术学习参考,学习中请遵循相关法律法规!
本文地址: https://www.juheyunku.com/jiaob/javascript/5390.shtml
相关文章
热门TAG
服务器 命令 技巧 详解 调用 标签 功能 织梦 javascript dedecms修改内容 织梦教程 php 白帽 企业网站 外链 权重 MYSQL 网站流量 实例解析 JSP 网站收录 搜索引擎 蜘蛛 windows jquery jquery教程 python tags标签 HTML 织梦cms最新文章
-
Javascript是什么?
时间:2021-01-04
-
Canvas入门实战之实现一个
时间:2021-01-04
-
11月份GitHub上最热门的Ja
时间:2021-01-04
-
一篇带给你JavaScript的Cla
时间:2021-01-04
-
详解js异步文件加载器
时间:2021-01-04
-
深入理解JavaScript中的箭头
时间:2021-01-04
-
复盘Node项目中遇到的13+常
时间:2021-01-04
-
连续3年稳居第一,全球
时间:2021-01-04
热门文章
-
连续3年稳居第一,全球1240万用户,Java
时间:2021-01-04
-
一篇带给你JavaScript的Class语法介绍
时间:2021-01-04
-
深入理解JavaScript中的箭头函数
时间:2021-01-04
-
Javascript在Chrome浏览器中调试的七个步骤
时间:2021-01-04
-
Canvas入门实战之实现一个图形验证码
时间:2021-01-04
-
详解js异步文件加载器
时间:2021-01-04
-
复盘Node项目中遇到的13+常见问题和解决方
时间:2021-01-04
-
11月份GitHub上最热门的JavaScript开源项目
时间:2021-01-04
-
Javascript是什么?
时间:2021-01-04
