多个函数并行执行处理
在一个函数里面需要进行三次执行处理,从数据库里面拿出数据,但是因为这三个是并行的,所以在取数据的时候会出现排队错误,因此想将这三次处理能有先后执行,这样就不会报错了,执行的顺序可以随便,那么应该来怎么实现呢???有没有参考的文档或者程序呢???
6 回复
改成串行?async库
使用 promise 或者直接使用递归
// async await版
;(async () => {
try {
let r1 = await f1()
let r2 = await f2()
let r3 = await f3()
console.log(r1, r2, r3)
} catch (err) {
console.log(err)
}
})()
// promise版
f1()
.then((r1) => {
console.log(r1)
return f2()
})
.then((r2) => {
console.log(r2)
return f3()
})
.then((r3) => {
console.log(r3)
})
.catch((err) => {
console.log(err)
})
function f1() {
return Promise.resolve('1')
}
function f2() {
return Promise.resolve('2')
}
function f3() {
return Promise.resolve('3')
}
我会这样处理,如果支持async await的话,看起来就很直观了。
既然执行顺序随便,那就相当于串行了,3楼答案那样async/await 或者 promise,利用async库的series()也可以
用promise有类似Promise.when([])的批量异步处理, 下面是leancloud的库 如
let promise1 = AV.Promise.resolve(1)
let promise2 = AV.Promise.resolve(2)
let promise3 = AV.Promise.resolve(3)
AV.Promise.all([promise1, promise2, promise3]).then(function (result) {
console.log(result);
})
最近一直在看cnodejs源码里,开源代码里使用的eventproxy,因为习惯,不太喜欢. 如:
var ep = new eventproxy();
ep.all('work1', 'work2', 'work3', function (work1, work2, work3) {
tofinish()
}
work(ep.done('work1'))
work(ep.done('work2'))
work(ep.done('work3'))
function req(id) {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log(id) // 顺序打印 1, 2, 3
resolve(id)
}, 100)
})
}
const arr = [0, 1, 2]
if (arr.length > 0) {
// 同步核心代码
let syncPromise = req(arr[0])
for (let i = 1; i < arr.length; i++) {
syncPromise = syncPromise.then(res => {
return req(arr[i])
})
}
syncPromise.then(res => {
// 全部处理完,处理
})
}
是不是想要这样的效果呢