关于异步的问题

28次阅读

共计 1223 个字符,预计需要花费 4 分钟才能阅读完成。

两个异步方法并行,等两个都执行结束

方法一,用 Promise.all

let wake = (time) => {let now = new Date().getSeconds()
  return new Promise((resolve, reject) => {setTimeout(() => {resolve(` 当前时间 ${now}, 之后时间 ${new Date().getSeconds()},${time / 1000}秒后醒来 `)
    }, time)
  })
}

let p1 = wake(3000)
let p2 = wake(2000)

Promise.all([p1, p2]).then((result) => {console.log(result) // ['3 秒后醒来', '2 秒后醒来']
  console.log('--------', new Date().getSeconds())
}).catch((error) => {console.log(error)
})

结果:
[‘ 当前时间 39, 之后时间 42,3 秒后醒来 ’, ‘ 当前时间 39, 之后时间 41,2 秒后醒来 ’]
——– 42
拓展:
Promise.race 用法类似用 Promise.all, 区别于 Promise.all 里面的方法是同时执行且等到所有异步方法执行完了才会回调;Promise.race 则是里面方法先执行结束,就返回那个结果,且不管结果本身是成功状态还是失败状态

参考:https://www.jianshu.com/p/7e6…

方法二,用 async 库(不是 es7 的 async/await)

并行 async.parallel 方法可以解决
拓展:async 的其他方法
串行 无关联 async.series
串行 有关联 async.waterfall

自动 async.auto
异步 for 循环 async.forEach

let arr = [1000, 2000, 3000]
let newArr = []

async.forEach(arr, (value, done) => {let now = new Date().getSeconds()
  setTimeout(function () {newArr.push(value)
    console.log('当前时间:', now, '结束时间:', new Date().getSeconds())
    done()}, value)
  // timeOut(value)
}, err => {if (err) console.error(err.message)
  // configs is now a map of JSON data
  console.log(newArr)
  console.log('最终时间', new Date().getSeconds())
})
console.log('最终时间 2', new Date().getSeconds())

结果:
最终时间 2 18
当前时间:18 结束时间:19
当前时间:18 结束时间:20
当前时间:18 结束时间:21
[1000, 2000, 3000]
最终时间 21

正文完
 0