学习链接

网道教程:promise

40+ 大厂常考 JS 手写题系列【摸鱼必备】(不该用 push,见测试)

Promise.allSettled

Promise.allSettled - 图1

  1. Promise.myAllSettled = promiseArr => {
  2. return new Promise((resolve, reject) => {
  3. if (!promiseArr[Symbol.iterator]) {
  4. throw new TypeError(`${promiseArr} is not iterable`);
  5. }
  6. if (!Array.isArray(promiseArr)) {
  7. promiseArr = Array.from(promiseArr);
  8. }
  9. const resArr = [];
  10. let count = 0;
  11. promiseArr.forEach((element, index) => {
  12. Promise.resolve(element).then(
  13. valule => {
  14. resArr[index] = {
  15. status: 'fulfilled',
  16. valule
  17. }
  18. count++;
  19. if (count === promiseArr.length) resolve(resArr);
  20. },
  21. reason => {
  22. resArr[index] = {
  23. status: 'rejected',
  24. reason
  25. }
  26. count++;
  27. if (count === promiseArr.length) resolve(resArr);
  28. }
  29. );
  30. });
  31. })
  32. };

测试

iterator 相关测试案例见这里

注意 setTimeout 设定的时间与输出数组的顺序。

  1. const p1 = new Promise((resolve, reject) => {
  2. setTimeout(resolve, 1000, 'p1');
  3. });
  4. const p2 = new Promise((resolve, reject) => {
  5. setTimeout(reject, 500, 'p2');
  6. });
  7. const p3 = new Promise((resolve, reject) => {
  8. setTimeout(reject, 1500, 'p3');
  9. }).catch(e => e);
  10. Promise.myAllSettled([p1, p2, p3])
  11. .then(res => console.log(res));
  12. Promise.allSettled([p1, p2, p3])
  13. .then(res => console.log(res));
  14. // [
  15. // {status: 'fulfilled', value: 'p1'},
  16. // {status: 'rejected', reason: 'p2'},
  17. // {status: 'fulfilled', value: 'p3'}
  18. // ]