js异步处理方案,js的异步串行与异步并行
一、什么是串行,并行,并发
串行:这个就像队列一样,一个执行完,下一个再执行,比如js同步执行
并发:是指这个系统拥有处理多个任务的能力,在一定时间发出,不需要同时性执行。js的异步消息队列让js拥有并发的能力
比如执行多个settimeout 它会挂载在消息队列,然后依次执行
并行:是指这个系统拥同时处理多个任务的能力,属于多线程的一种方式,而js是属于单线程 虽然可以通过worker来创建多线程,但是子线程
完全受主线程控制,没有改变JavaScript单线程的本质
串行示意图:
有人会问,异步不是都在消息队列吗,不就是一个一个执行了吗?
举个例子,如果本身就是串行执行,那么你现在执行2给个任务,一个是5秒后打印console.log(1),一个是十秒后打印console.log(2)
按照串行应该是15秒执行完毕,但实际耗时是10秒,如上这是并发,
console.time()
setTimeout(() => {
console.log(1)
}, 5000);
setTimeout(() => {
console.log(2)
console.timeEnd()
}, 10000);
二、实现异步串行
大多时候我们可以用 promise 和async await来解决
promise
比较少的时候,可以用.then来实现串行
var a = function() {
return new Promise((resolve, reject) => {
setTimeout(() => {
consloe.log('a')
resolve('a')
}, 3000)
})
}
var b = function() {
return new Promise((resolve, reject) => {
setTimeout(() => {
consloe.log('b')
resolve('b')
}, 2000)
})
};
console.time('test')
a().then((aa) => {
b().then((bb) => {
console.log(`${aa}-${bb}`)
console.timeEnd('test')
})
})