
1 bi531334444 2020 年 6 月 6 日 for of + async await ? |
2 ericls 2020 年 6 月 6 日 promise.all? |
3 cxe2v 2020 年 6 月 6 日 foreach 我记得是同步的 |
4 VDimos 2020 年 6 月 6 日 via Android foreach 是异步是啥意思? |
5 mazai 2020 年 6 月 6 日 重新定义 foreach |
6 mikicomo 2020 年 6 月 6 日 写 java 的,不过题主的意思我明白了,foreach 中循环的方法体中调用了异步方法,而你又需要在后面的代码中使用 foreach 循环体中生成的数据,对标 java 中的 Future,可以搜一下 js 中怎么实现的 |
7 ljpCN 2020 年 6 月 6 日 别用 foreach,用 map+Promise.all |
8 px920906 2020 年 6 月 6 日 php 吗? js 用 promise 的话可以这样: ```js let queue = Promise.resolve() arr.forEach(e => { queue = queue.then(() => someAsyncFunc(e)) }) ``` 当然 async/await 也可以 ```js async (function() { arr.forEach(e => { await someAsyncFunc(e) }) })() ``` |
9 cnrting 2020 年 6 月 6 日 via iPhone for 循环不是同步的吗??? |
10 Trim21 2020 年 6 月 6 日 via Android 楼主的意思是 foreach 传进的那个函数是异步的… |
11 seki 2020 年 6 月 6 日 用 bluebird.each 或者 p-each-series 这样的库 |
12 meteor957 2020 年 6 月 6 日 via Android reduce |
13 will0404 2020 年 6 月 6 日 ``` const arr = [1, 2, 3]; const promises = []; arr.forEach(v => { promises.push(Promise.resolve(v)); }); Promise.all(promises).then(result => { console.log(result); // [1,2,3] }); ``` |
14 GG668v26Fd55CP5W 2020 年 6 月 6 日 via iPhone foreach 是同步的好吗? |
15 WittBulter 2020 年 6 月 6 日 1. 继发: Loop await 即可 2. 继发 Iterator: for await of 即可 3. 并发: Promise.all([].map(async item => await todo(item))) 是比较简单的方式 4. 并发但忽略 reject 直到所有异步都完成: 3 改成 Promise.allSettled 。其他的并发但状态需求不同可参考其他 Promise 静态方法 8 楼的例子还有其他几楼由明显错误,await 只能在 async 下,即便 forEach 了 async,在可读性上也是误以为继发的并发任务,有阅读歧义。此外 forEach 是典型的副作用的函数。 |
16 a132811 2020 年 6 月 6 日 多提了下。 @WittBulter 最新的 v8 已经支持 top await 了,不用限制 await 在 async 了。 目前 deno 、chrome 80 、firefox 72 已支持 top await. ```` export default cOnfig= await Promise.resolve({env:'dev'}) ``` |
17 gauzung 2020 年 6 月 6 日 async fun(){for(...){await ...}} 每次循环请求一个接口,成功 /失败后才执行下一次循环 |
18 JayLin1011 2020 年 6 月 6 日 for..await...of 或者 Promsie.all(),异步并发问题一般需要计数器作为哨兵变量。 |
19 wangyzj 2020 年 6 月 7 日 foreach 是同步的 |
20 qinfensky 2020 年 6 月 7 日 via iPhone @px920906 你这个是不是有问题的呢?在 foreach 的匿名函数中 await 应该是不可以的吧。作用域变动了,用 for 就可以 await |
21 px920906 2020 年 6 月 7 日 @WittBulter @qinfensky 是的,,写了个不负责任的回答,惭愧,谢谢指出。 自己试了一下,即使 async 放在 forEach 的匿名函数前也没用,会并行执行,查了一下这好像是个常见的误区。 http://objcer.com/2017/10/12/async-await-with-forEach/ https://stackoverflow.com/questions/37576685/using-async-await-with-a-foreach-loop |
22 ruby109 2020 年 6 月 9 日 const a = await Promise.all(array.map(async element => { return await asyncFunction(); }); |
23 source 2020 年 7 月 10 日 指出一点:forEach 的回调不能直接套 async/await 其他的方式都没问题,比如 promise.all |
24 jake361 2020 年 7 月 31 日 foreach 就是同步得啊,你的意思是不是在 foreach 里面异步调用? 有两种解决方案,一个是 Promise all,配合 async await,最新版本的 node 应该支持了 如果是老版本的 node,有一个库 http://caolan.github.io/async/v3/, 应该可以解决你的问题 |