多个函数并行执行处理
发布于 7 年前 作者 quanpf2481 5549 次浏览 来自 问答

在一个函数里面需要进行三次执行处理,从数据库里面拿出数据,但是因为这三个是并行的,所以在取数据的时候会出现排队错误,因此想将这三次处理能有先后执行,这样就不会报错了,执行的顺序可以随便,那么应该来怎么实现呢???有没有参考的文档或者程序呢???

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 => {
    // 全部处理完,处理
  })
}

是不是想要这样的效果呢

回到顶部