
按理说 promise.all 里异步是并行的 for of 循环做异步操作是串行的 在 promise.all 方法里运行时间应该更短,但是遇到了问题? 为什么在 promise.all()方法中做 mongoDB 的查询操作 要比在 for of 里的做同样的操作时间更久
async function test(){ let userItem=await User.find({},{uid:1,_id:0}).limit(10) console.time('程序耗时 1') for(var item of userItem){ await User.findOne({ uid:item.uid }) } console.timeEnd('程序耗时 1') console.time('程序耗时 2') await Promise.all(userItem.map(async item=>{ let user=await User.findOne({ uid:item.uid }) return user })) console.timeEnd('程序耗时 2') } 程序耗时 1: 32.129ms 程序耗时 2: 3025.852s 感觉 promise.all 方法查询完之后卡了好久才返回结果 猜测是数据库的连接问题吗?? 求大佬解答!
1 geelaw 2019-06-07 02:13:36 +08:00 via iPhone 是“并发”而不是“并行”。 Promise.all 等价于下面这个写法(不考虑异常情况): var awaitables = []; for (var item of userItem) awaitables.push(User.findOne({ uid: item.uid }); for (var awtb of awaitables) await awtb; 你可以试试这样做的情况。 另外你的计时方法不好,应该掐头(抹去 JIT 编译)并重复。 |
2 WittBulter 2019-06-07 02:55:08 +08:00 你的 `for of` 中的 await 会等待上一个执行完才会执行下一个。 Promise.all 并不会保证顺序,也不等待上一个异步任务执行完,但是可以保证在所有异步全部执行完后才结束。 |
3 zjsxwc 2019-06-07 07:02:33 +08:00 via Android 试试直接返回 promise 呗, await Promise.all(userItem.map(item=>{return User.findOne({ uid:item.uid }) })) 楼主原先的写法类似于一群已经拉完屎的人挤在厕所等茅坑。 |
4 liufei123 OP @zjsxwc 对我之后就是直接返回的 promise 但是时间感觉也是差不多 promise.all 还是会卡好久 |
5 zjsxwc 2019-06-07 14:00:08 +08:00 via Android |
7 SoloCompany 2019-06-07 17:50:36 +08:00 via iPad 怀疑你用了 babel 或者 nodejs 使用了出乎意料的优化导致 建议你修改一下程序 1,把循环 await 返回值保存到一个数组里面而不是直接丢弃 |
8 iugo 2019-06-07 18:32:24 +08:00 不应该是 User.find 比 User.findOne 快的问题吗? 和 Promise 没有关系. |
10 jiejiss 2019-06-07 19:52:52 +08:00 我感觉是你的 Promise.all 用的不对 把 userItem.map(后面的函数的 async 和 await 去掉试试 |
13 jiejiss 2019-06-08 12:51:09 +08:00 |