实现sleep
原理是利用await可以暂停await之后的代码执行。
const sleep = (time) => {
return new Promise( (resolve)=>{ setTimeout(resolve , time)} )
}
使用:
async function foo(){
await sleep(1500)
}
并行执行异步任务
下面只能等待前一个执行完才会执行下一个
// 假设taskA taskB taskC taskD是四个不同延时时间的异步任务
(async () => {
await taskA()
await taskB()
await taskC()
await taskD()
})()
如果异步任务之间并不相互依赖,可以平行执行:
下面是平行执行异步请求的,但是会等到await还是会按顺序执行
(async () => {
const tasks = [taskA , taskB , taskC , taskD] // 假设分别返回1 2 3 4
const promises = Array(4).fill(null).map((_ , i) => tasks[i]()) // 先全部调用拿到pending的promise放到数组中
// 遍历数组
for(const p of promises){
const res = await p
console.log(res)
}
})()
// 1 2 3 4
取消promise
搞不懂,红宝书是创建了一个类,该类上面有一个promise实例将resolve暴露给传入构造函数的回调函数,在回调函数中可以resolve这个promise,然后就会触发promise.then的回调,在回调中去取消异步操作。
promise进度通知
实现原理:扩展promise,增加notify方法用于添加通知的回调函数,给实例化时的执行器函数传入一个notify方法,调用该方法可以触发通知回调。
class TrackablePromise extends Promise {
constructor(executor){
// 存放添加的通知回调函数
const notifyCallbacks = []
// 扩展Promise的executor
super((resolve , reject) => {
return executor(resolve , reject , (status) => {
notifyCallbacks.map(cb => cb(status))
})
})
this.notifyCallbacks = notifyCallbacks
}
this.notify = (cb) => {
this.notifyCallbacks.push(cb)
return this
}
}