promise.all,promise手写
时间: 2023-11-16 18:00:17 浏览: 86
Promise.all是一个方法,它接收一个promise对象组成的数组作为参数,当数组中所有的promise对象都变为fulfilled状态时,Promise.all返回一个新的promise对象,其状态为fulfilled,并将所有promise对象的结果组成一个数组作为该promise对象的结果。当数组中有一个promise对象变为rejected状态时,Promise.all返回一个新的promise对象,其状态为rejected,并将第一个被rejected的promise对象的结果作为该promise对象的结果。下面是一个使用Promise.all的例子:
```javascript
const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);
Promise.all([promise1, promise2, promise3])
.then(values => {
console.log(values); // [1, 2, 3]
});
```
手写Promise的实现需要遵循Promise/A+规范,主要包括以下几个部分:
1. Promise构造函数:接收一个executor函数作为参数,executor函数接收两个函数参数resolve和reject,分别表示promise对象的状态变为fulfilled和rejected时的回调函数。
2. then方法:接收两个函数参数onFulfilled和onRejected,分别表示promise对象的状态变为fulfilled和rejected时的回调函数。then方法返回一个新的promise对象。
3. resolve方法:接收一个参数value,如果value是一个promise对象,则返回该promise对象;否则返回一个新的promise对象,其状态为fulfilled,并将value作为该promise对象的结果。
4. reject方法:接收一个参数reason,返回一个新的promise对象,其状态为rejected,并将reason作为该promise对象的结果。
下面是一个简单的手写Promise的实现:
```javascript
class MyPromise {
constructor(executor) {
this.status = 'pending';
this.value = undefined;
this.reason = undefined;
this.onFulfilledCallbacks = [];
this.onRejectedCallbacks = [];
const resolve = value => {
if (this.status === 'pending') {
this.status = 'fulfilled';
this.value = value;
this.onFulfilledCallbacks.forEach(callback => callback(this.value));
}
};
const reject = reason => {
if (this.status === 'pending') {
this.status = 'rejected';
this.reason = reason;
this.onRejectedCallbacks.forEach(callback => callback(this.reason));
}
};
try {
executor(resolve, reject);
} catch (error) {
reject(error);
}
}
then(onFulfilled, onRejected) {
onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : value => value;
onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason };
const promise2 = new MyPromise((resolve, reject) => {
if (this.status === 'fulfilled') {
setTimeout(() => {
try {
const x = onFulfilled(this.value);
this.resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
} else if (this.status === 'rejected') {
setTimeout(() => {
try {
const x = onRejected(this.reason);
this.resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
} else {
this.onFulfilledCallbacks.push(value => {
setTimeout(() => {
try {
const x = onFulfilled(value);
this.resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
this.onRejectedCallbacks.push(reason => {
setTimeout(() => {
try {
const x = onRejected(reason);
this.resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
}
});
return promise2;
}
resolvePromise(promise2, x, resolve, reject) {
if (promise2 === x) {
reject(new TypeError('Chaining cycle detected for promise'));
}
let called = false;
if (x !== null && (typeof x === 'object' || typeof x === 'function')) {
try {
const then = x.then;
if (typeof then === 'function') {
then.call(x, y => {
if (called) return;
called = true;
this.resolvePromise(promise2, y, resolve, reject);
}, r => {
if (called) return;
called = true;
reject(r);
});
} else {
resolve(x);
}
} catch (error) {
if (called) return;
called = true;
reject(error);
}
} else {
resolve(x);
}
}
static resolve(value) {
if (value instanceof MyPromise) {
return value;
}
return new MyPromise(resolve => resolve(value));
}
static reject(reason) {
return new MyPromise((resolve, reject) => reject(reason));
}
static all(promises) {
return new MyPromise((resolve, reject) => {
const results = [];
let count = 0;
promises.forEach((promise, index) => {
MyPromise.resolve(promise).then(value => {
results[index] = value;
count++;
if (count === promises.length) {
resolve(results);
}
}, reason => {
reject(reason);
});
});
});
}
}
```
阅读全文