实现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 4const promises = Array(4).fill(null).map((_ , i) => tasks[i]()) // 先全部调用拿到pending的promise放到数组中// 遍历数组for(const p of promises){const res = await pconsole.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的executorsuper((resolve , reject) => {return executor(resolve , reject , (status) => {notifyCallbacks.map(cb => cb(status))})})this.notifyCallbacks = notifyCallbacks}this.notify = (cb) => {this.notifyCallbacks.push(cb)return this}}
