使用async如何进行并发处理?
发布于 9 个月前 作者 fruit-memory 2564 次浏览 来自 问答

<p>sequelize目前使用的是promise,多条update语句还是得用promise.all吗?</p>

28 回复

await在for循环中可以使用😄

for里面的await是串行执行, 并不是并行

多条 update 用 promise.all 包有啥问题么?

@XiaozhongLiu await的串行和并行有什么具体的区别吗?

跟单线程的串行和并行没啥区别吧

我用sequelize的时候没找到多个数据的同时update的方法,sequelize好像是没有的。 自己用的是Transaction加for循环,如果有更好的解决办法,我也想知道。

为什么要循环去update, 代码放出来看看

循环update是什么需求?

Transaction+Promise.all

@XiaozhongLiu 前端有个批量操作,所以需要批量更新数据库

@linliny 我去看看😁

忘说了,我用的数据库是MySQL,好像transaction用不上?

for循环中的await会影响下一次循环,也就是等一个await完成后才会执行下一个 如果需要并发可以使用forEach

阮一峰书里面好像有提到<br/><br/><a class=“form” href=“https://github.com/shinygang/Vue-cnodejs”>I‘m webapp-cnodejs-vue</a>

@fruit-memory 这样循环可以继续?<br/><br/><a class=“form” href=“https://github.com/shinygang/Vue-cnodejs”>I‘m webapp-cnodejs-vue</a>

@lzghzr foreach还有这种操作?

@fruit-memory 因为forEach的参数是个函数

使用async关键字的函数实际上返回的是一个Promise对象

综合以上两点的话就不难理解await在for和forEach表现为什么不同了

所以使用forEach的话不是很好控制,await Promise.all()会等所有异步操作完成才会执行下一行代码,forEach则不会

use https://github.com/magicdawn/promise.map

const promise = pmap(array, async (item, index) => { /* blabla */ }, concurrency)

concurrency 就是并发

机制和 async.parallelLimit / bluebird Promise.map 一样的

@magicdawn 这个好像跟那个foreach的差不多?每次产生一个新的async函数执行await

@fruit-memory

  • forEach 实现不了 await
  • for 循环 + await 并发为 1
  • Promise.all + array.map 并发为 Infinity

用await Promise.all() 或者es2018 的 await for()

@yuu2lee4 es2018?我去看看

transaction和promise.all可以搞定

我都这样写

await Promise.all(_.map(funs, () => new Promise(async (resolve, reject) => {
	try{
		resolve();
	} catch {
		reject();
	}
})));

@Rukeith 你这是用了lodash?

@fruit-memory 对喔,用 lodash 来 map,用原生的也是可以啦

await Promise.all(tasks.map(function(task){
  return new Promise(function(resolve){
    // ...
    resolve()
  })
}))
回到顶部