学习链接

网道教程:Promise

网道教程:对象的扩展

Promise.any

Promise.any - 图1

AggregateError 构造函数

  1. AggregateError(errors[, message])
  • errors:数组,它的每个成员都是一个错误对象。该参数是必须的。
  • message:字符串,表示 AggregateError 抛出时的提示信息。该参数是可选的。

AggregateError 的实例对象有三个属性。

  • name:错误名称,默认为“AggregateError”。
  • message:错误的提示信息。
  • errors:数组,每个成员都是一个错误对象。
  1. Promise.myAny = 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 result = [];
  10. let count = 0;
  11. promiseArr.forEach((p, i) => {
  12. Promise.resolve(p).then(
  13. value => {
  14. resolve(value);
  15. },
  16. reason => {
  17. count++;
  18. result[i] = reason;
  19. if (count === promiseArr.length) {
  20. reject(new AggregateError(result, 'All Promises were rejected'));
  21. }
  22. }
  23. )
  24. });
  25. })
  26. }

测试

iterator 相关测试案例见这里

  1. const resolved = Promise.resolve(42);
  2. const rejected = Promise.reject(-1);
  3. const alsoRejected = Promise.reject(Infinity);
  4. Promise.any([resolved, rejected, alsoRejected])
  5. .then((result) => console.log(result)); // 42
  6. Promise.any([rejected, alsoRejected])
  7. .catch( reason => {
  8. console.log(reason); // AggregateError: All promises were rejected
  9. console.log(reason.name); // AggregateError
  10. console.log(reason.message); // All promises were rejected
  11. console.log(reason.errors); // [-1, Infinity]
  12. });
  13. Promise.myAny([resolved, rejected, alsoRejected])
  14. .then((result) => console.log(result));
  15. Promise.myAny([rejected, alsoRejected])
  16. .catch( reason => {
  17. console.log(reason);
  18. console.log(reason.name);
  19. console.log(reason.message);
  20. console.log(reason.errors);
  21. });