Promise

类方法

  1. Promise.resolve():有时候我们已经有了现成的内容了,希望将它转成Promise来使用,这个时候我们就可以可以Promise.resolve(value)方法来完成,Promise.resolve()相当于new Promise,并且执行resolve操作。resolve方法的参数依旧有三种形态
    1. 普通值/对象
    2. Promise对象
    3. thenable对象 ```javascript // 转成Promise对象 // function foo() { // const obj = { name: “why” } // return new Promise((resolve) => { // resolve(obj) // }) // }

// foo().then(res => { // console.log(“res:”, res) // })

// 类方法Promise.resolve // 1.普通的值 // const promise = Promise.resolve({ name: “why” }) // 相当于 // const promise2 = new Promise((resolve, reject) => { // resolve({ name: “why” }) // })

// 2.传入Promise const promise = Promise.resolve(new Promise((resolve, reject) => { resolve(“11111”) }))

promise.then(res => { console.log(“res:”, res) })

// 3.传入thenable对象

  1. 2. `Promise.reject()`: 作用跟`resolve`一样,但是`reject`无论传入什么参数都是直接拒绝返回
  2. ```javascript
  3. // const promise = Promise.reject("rejected message")
  4. // 相当于
  5. // const promise2 = new Promsie((resolve, reject) => {
  6. // reject("rejected message")
  7. // })
  8. // 注意: 无论传入什么值都是一样的
  9. const promise = Promise.reject(new Promise(() => {}))
  10. promise.then(res => {
  11. console.log("res:", res)
  12. }).catch(err => {
  13. console.log("err:", err)
  14. })
  1. Promise.all():传入一个promise数组(如果参数不是promise对象会自动转成Promise对象),等到所有子项的状态都变成fulfilled时,按照数组的顺序返回对应的结果,如果其中有一个意外中断(拒绝),马上返回这个拒绝的结果 ```javascript // 创建多个Promise const p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve(11111) }, 1000); })

const p2 = new Promise((resolve, reject) => { setTimeout(() => { reject(22222) }, 2000); })

const p3 = new Promise((resolve, reject) => { setTimeout(() => { resolve(33333) }, 3000); })

// 需求: 所有的Promise都变成fulfilled时, 再拿到结果 // 意外: 在拿到所有结果之前, 有一个promise变成了rejected, 那么整个promise是rejected Promise.all([p2, p1, p3, “aaaa”]).then(res => { console.log(res) }).catch(err => { console.log(“err:”, err) })

  1. 4. `Promise.allSetted()`:传入一个promise数组(如果参数不是promise对象会自动转成Promise对象),等到所有子项都有结果时,会按照顺序返回对应的结果数组,结果数组里的子项是对象,会有子项的状态和结果值。
  2. ```javascript
  3. // 创建多个Promise
  4. const p1 = new Promise((resolve, reject) => {
  5. setTimeout(() => {
  6. resolve(11111)
  7. }, 1000);
  8. })
  9. const p2 = new Promise((resolve, reject) => {
  10. setTimeout(() => {
  11. reject(22222)
  12. }, 2000);
  13. })
  14. const p3 = new Promise((resolve, reject) => {
  15. setTimeout(() => {
  16. resolve(33333)
  17. }, 3000);
  18. })
  19. // allSettled
  20. Promise.allSettled([p1, p2, p3]).then(res => {
  21. console.log(res)
  22. }).catch(err => {
  23. console.log(err)
  24. })
  1. Promise.race:传入一个promise数组(如果参数不是promise对象会自动转成Promise对象),等到某一个子项有结果时,无论成功或者失败,都直接 return出结果 ```javascript // 创建多个Promise const p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve(11111) }, 3000); })

const p2 = new Promise((resolve, reject) => { setTimeout(() => { reject(22222) }, 500); })

const p3 = new Promise((resolve, reject) => { setTimeout(() => { resolve(33333) }, 1000); })

// race: 竞技/竞赛 // 只要有一个Promise变成fulfilled状态, 那么就结束 // 意外: Promise.race([p1, p2, p3]).then(res => { console.log(“res:”, res) }).catch(err => { console.log(“err:”, err) })

  1. 6. `Promise.any`:传入一个promise数组(如果参数不是promise对象会自动转成Promise对象),等到某一个子项的状态变成`fulfilled`时,才会返回出结果。如果所有子项的结果都是`rejected`,那么会把所有的错误信息收集起来,返回一个报错。通过`.errors`可以看到
  2. ```javascript
  3. // 创建多个Promise
  4. const p1 = new Promise((resolve, reject) => {
  5. setTimeout(() => {
  6. // resolve(11111)
  7. reject(1111)
  8. }, 1000);
  9. })
  10. const p2 = new Promise((resolve, reject) => {
  11. setTimeout(() => {
  12. reject(22222)
  13. }, 500);
  14. })
  15. const p3 = new Promise((resolve, reject) => {
  16. setTimeout(() => {
  17. // resolve(33333)
  18. reject(3333)
  19. }, 3000);
  20. })
  21. // any方法
  22. Promise.any([p1, p2, p3]).then(res => {
  23. console.log("res:", res)
  24. }).catch(err => {
  25. console.log("err:", err.errors)
  26. })

Promise串行

  1. const timeout = (ms) =>
  2. new Promise((resolve, reject) => {
  3. setTimeout(() => {
  4. resolve();
  5. }, ms);
  6. });
  7. const ajax1 = () =>
  8. timeout(3000).then(() => {
  9. console.log("1");
  10. return 1;
  11. });
  12. const ajax2 = () =>
  13. timeout(1000).then(() => {
  14. console.log("2");
  15. return 2;
  16. });
  17. const ajax3 = () =>
  18. timeout(2000).then(() => {
  19. console.log("3");
  20. return 3;
  21. });
  22. const mergePromise = (ajaxArray) => {
  23. // 在这里实现你的代码
  24. // 初始化
  25. let initPromise = Promise.resolve();
  26. let result = [];
  27. return new Promise((resolve, reject) => {
  28. ajaxArray.reduce( (pre, cur) => {
  29. // 根据上一轮Promise的结果来决定当前的结果
  30. return pre.then(cur)
  31. .then((res) => { // 用于输出最后的data[1,2,3]
  32. result.push(res);
  33. })
  34. }, initPromise) // initPromise为初始化值
  35. .then(() => { // ajaxArray遍历结束,resolve reuslt
  36. resolve(result);
  37. })
  38. })
  39. };
  40. // 每一轮都会产生一个promise结果
  41. // 等到结束了,会resolve出一个result
  42. mergePromise([ajax1, ajax2, ajax3]).then((data) => {
  43. console.log(data)
  44. }); // data 为 [1, 2, 3]});
  45. // 要求分别输出// 1// 2// 3// done// [1, 2, 3]

Promise红绿灯

  1. // Promise红绿灯
  2. const delay = (ms) =>
  3. new Promise((resolve, reject) => {
  4. setTimeout(() => {
  5. resolve();
  6. }, ms)
  7. })
  8. function lighting(arr){
  9. arr.reduce(
  10. (pre, cur) => pre.then(cur).then((res) => console.log(res)),
  11. Promise.resolve())
  12. .then(() => lighting(arr));
  13. }
  14. let arr = [
  15. () => delay(3000).then(() => 'red'),
  16. () => delay(2000).then(() => 'yellow'),
  17. () => delay(1000).then(() => 'green')
  18. ]
  19. lighting(arr);

算法

image.png
image.png
image.png