promise


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
class MyPromise {
constructor(fn){
// 存储 reslove 回调函数列表
   this.callbacks = []
   const resolve = (value) => {
this.data = value // 返回值给后面的 .then
     while(this.callbacks.length) {
let cb = this.callbacks.shift()
       cb(value)
    }
  }
   fn(resolve)
}
 then(onResolvedCallback) {
return new MyPromise((resolve) => {
this.callbacks.push(() => {
const res = onResolvedCallback(this.data)
       if (res instanceof MyPromise) {
res.then(resolve)
      } else {
resolve(res)
      }
    })
  })
}
}
// 这是测试案例
new MyPromise((resolve) => {
setTimeout(() => {
resolve(1)
}, 1000)
}).then((res) => {
console.log(res)
   return new MyPromise((resolve) => {
setTimeout(() => {
resolve(2)
    }, 1000)
  })
}).then(res =>{console.log(res)})

promise.all


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MyPromise.all = function (promisesList) {
 return new MyPromise((resolve, reject) => {
   if (!Array.isArray(promiselList) return reject(new Error('必须是数组'))
   if (!promisesList.length) return resolve([])
   let arr = [], count = 0
   // 直接循环同时执行传进来的promise
   for (let i = 0, len = promisesList.length; i < len; i++) {
     // 因为有可能是 promise 有可能不是,所以用resolve()不管是不是都会自动转成promise
     Promise.resolve(promise).then(result => {
         // 由到promise在初始化的时候就执行了,.then只是拿结果而已,所以执行完成的顺序有可能和传进来的数组不一样
         // 也就是说直接push到arr的话,顺序有可能会出错
         count++
         arr[i] = result
         // 不能用arr.length===len,是因为数组的特性
         // arr=[]; arr[3]='xx'; console.log(arr.length) 这打印出来会是4 而不是1
         if(count === len) resolve(arr)
    }).catch(err => reject(err))
  }
})
}

promise.race


传参和上面的 all 一模一样,传入一个 Promise 实例集合的数组,然后全部同时执行,谁先快先执行完就返回谁,只返回一个结果

1
2
3
4
5
6
7
8
9
10
MyPromise.race = function(promisesList) {
 return new MyPromise((resolve, reject) => {
   // 直接循环同时执行传进来的promise
   for (const promise of promisesList) {
     // 直接返回出去了,所以只有一个,就看哪个快
     promise.then(resolve, reject)
  }
})
}