CNode

使用async如何进行并发处理?

问答
Ffruit-memory发布于8 年前最后回复8 年前27 回复8400 浏览0 收藏
查看回复

回复 (27)

J
jiyarong#1·8 年前

循环update是什么需求?

Z
zubincheung#2·8 年前

Transaction+Promise.all

F
fruit-memory#3·8 年前

await在for循环中可以使用😄

X
xiaozhongliu#4·8 年前

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

R
rrbe#5·8 年前

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

F
fruit-memory#6·8 年前
引用 xiaozhongliufor里面的await是串行执行, 并不是并行

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

F
fruit-memory#7·8 年前

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

L
linliny#8·8 年前

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

X
xiaozhongliu#9·8 年前

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

F
fruit-memory#10·8 年前
引用 xiaozhongliu为什么要循环去update, 代码放出来看看

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

F
fruit-memory#12·8 年前

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

L
lzghzr#13·8 年前

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

L
leijuns#14·8 年前

阮一峰书里面好像有提到I‘m webapp-cnodejs-vue

L
leijuns#15·8 年前
引用 fruit-memoryawait在for循环中可以使用😄

@fruit-memory 这样循环可以继续?I‘m webapp-cnodejs-vue

L
lzghzr#17·8 年前
引用 fruit-memory@lzghzr foreach还有这种操作?

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

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

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

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

M
magicdawn#18·8 年前

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

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

concurrency 就是并发

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

F
fruit-memory#20·8 年前
引用 magicdawnuse https://github.com/magicdawn/promise.map concurrency 就是并发 机制和 async.parallelLimit / bluebird...

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

M
magicdawn#21·8 年前
引用 fruit-memory@magicdawn 这个好像跟那个foreach的差不多?每次产生一个新的async函数执行await

@fruit-memory

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

Y
yuu2lee4#22·8 年前

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

F
fruit-memory#23·8 年前
Y
yessirpopesama#24·8 年前

transaction和promise.all可以搞定

R
Rukeith#25·8 年前

我都这样写

await Promise.all(_.map(funs, () => new Promise(async (resolve, reject) => {
	try{
		resolve();
	} catch {
		reject();
	}
})));
R
Rukeith#27·8 年前
引用 fruit-memory@Rukeith 你这是用了lodash?

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

参与回复
登录后即可参与回复。登录