实现sleep

原理是利用await可以暂停await之后的代码执行。

  1. const sleep = (time) => {
  2. return new Promise( (resolve)=>{ setTimeout(resolve , time)} )
  3. }

使用:

  1. async function foo(){
  2. await sleep(1500)
  3. }

并行执行异步任务

下面只能等待前一个执行完才会执行下一个

  1. // 假设taskA taskB taskC taskD是四个不同延时时间的异步任务
  2. (async () => {
  3. await taskA()
  4. await taskB()
  5. await taskC()
  6. await taskD()
  7. })()

如果异步任务之间并不相互依赖,可以平行执行:
下面是平行执行异步请求的,但是会等到await还是会按顺序执行

  1. (async () => {
  2. const tasks = [taskA , taskB , taskC , taskD] // 假设分别返回1 2 3 4
  3. const promises = Array(4).fill(null).map((_ , i) => tasks[i]()) // 先全部调用拿到pending的promise放到数组中
  4. // 遍历数组
  5. for(const p of promises){
  6. const res = await p
  7. console.log(res)
  8. }
  9. })()
  10. // 1 2 3 4

取消promise

搞不懂,红宝书是创建了一个类,该类上面有一个promise实例将resolve暴露给传入构造函数的回调函数,在回调函数中可以resolve这个promise,然后就会触发promise.then的回调,在回调中去取消异步操作。

promise进度通知

实现原理:扩展promise,增加notify方法用于添加通知的回调函数,给实例化时的执行器函数传入一个notify方法,调用该方法可以触发通知回调。

  1. class TrackablePromise extends Promise {
  2. constructor(executor){
  3. // 存放添加的通知回调函数
  4. const notifyCallbacks = []
  5. // 扩展Promise的executor
  6. super((resolve , reject) => {
  7. return executor(resolve , reject , (status) => {
  8. notifyCallbacks.map(cb => cb(status))
  9. })
  10. })
  11. this.notifyCallbacks = notifyCallbacks
  12. }
  13. this.notify = (cb) => {
  14. this.notifyCallbacks.push(cb)
  15. return this
  16. }
  17. }