promise实现原理
时间: 2023-06-25 22:07:46 浏览: 60
Promise是一种处理异步操作的方式,它代表了一个尚未完成但将在未来完成的操作。其实现原理涉及到状态转换、回调函数的管理等多个方面。
Promise对象有三种状态:pending(等待中)、fulfilled(已成功)和rejected(已失败)。Promise对象创建后,一开始是处于pending状态。
当异步操作成功时,Promise对象的状态会从pending变成fulfilled,同时会执行then()方法中传入的成功回调函数。当异步操作失败时,Promise对象的状态会从pending变成rejected,同时会执行catch()方法中传入的失败回调函数。
Promise对象的状态一旦发生变化,就无法再次改变。这也是Promise的重要特点之一。
Promise实现的核心是使用了一个executor函数,该函数会立即执行并传入两个参数:resolve和reject。通过调用resolve和reject函数,可以将Promise对象的状态从pending变成fulfilled或rejected。
在实现过程中,Promise还需要管理回调函数的执行。当Promise对象的状态发生变化时,它需要按照添加回调函数的顺序依次执行对应的回调函数。
总之,Promise实现原理涉及到状态管理、回调函数管理和executor函数的使用,它为异步编程提供了一种更方便、更优雅的方式。
相关问题
promise 的实现原理
Promise是一种用于处理异步操作的JavaScript对象。它提供了一种更优雅和可读性更高的方式来处理异步代码,避免了回调地狱的问题。Promise有三个状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。当Promise的状态发生改变时,会触发相应的回调函数。
以下是一个简单的Promise实现原理的例子:
```javascript
class MyPromise {
constructor(executor) {
this.status = 'pending';
this.value = undefined;
this.reason = undefined;
this.onResolvedCallbacks = [];
this.onRejectedCallbacks = [];
const resolve = (value) => {
if (this.status === 'pending') {
this.status = 'fulfilled';
this.value = value;
this.onResolvedCallbacks.forEach((callback) => callback());
}
};
const reject = (reason) => {
if (this.status === 'pending') {
this.status = 'rejected';
this.reason = reason;
this.onRejectedCallbacks.forEach((callback) => callback());
}
};
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);
}
if (this.status === 'rejected') {
setTimeout(() => {
try {
const x = onRejected(this.reason);
this.resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
}
if (this.status === 'pending') {
this.onResolvedCallbacks.push(() => {
setTimeout(() => {
try {
const x = onFulfilled(this.value);
this.resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
this.onRejectedCallbacks.push(() => {
setTimeout(() => {
try {
const x = onRejected(this.reason);
this.resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
}
});
return promise2;
}
resolvePromise(promise2, x, resolve, reject) {
if (promise2 === x) {
return reject(new TypeError('Chaining cycle detected for promise'));
}
if (x instanceof MyPromise) {
x.then(resolve, reject);
} else {
resolve(x);
}
}
catch(onRejected) {
return this.then(null, onRejected);
}
}
```
这个例子展示了一个简单的Promise实现,包括Promise的构造函数、状态的改变、回调函数的执行、链式调用以及错误处理等。
Promise实现原理,给一份实现代码
Promise 是一种异步编程的解决方案,其本质上是一个状态机,包含三种状态:pending、fulfilled 和 rejected。
以下是 Promise 的基本实现代码:
```javascript
class Promise {
constructor(executor) {
this.state = 'pending';
this.value = undefined;
this.reason = undefined;
this.onFulfilledCallbacks = [];
this.onRejectedCallbacks = [];
const resolve = (value) => {
if (this.state === 'pending') {
this.state = 'fulfilled';
this.value = value;
this.onFulfilledCallbacks.forEach((callback) => callback());
}
};
const reject = (reason) => {
if (this.state === 'pending') {
this.state = 'rejected';
this.reason = reason;
this.onRejectedCallbacks.forEach((callback) => callback());
}
};
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 Promise((resolve, reject) => {
if (this.state === 'fulfilled') {
setTimeout(() => {
try {
const x = onFulfilled(this.value);
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
} else if (this.state === 'rejected') {
setTimeout(() => {
try {
const x = onRejected(this.reason);
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
} else {
this.onFulfilledCallbacks.push(() => {
setTimeout(() => {
try {
const x = onFulfilled(this.value);
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
this.onRejectedCallbacks.push(() => {
setTimeout(() => {
try {
const x = onRejected(this.reason);
resolvePromise(promise2, x, resolve, reject);
} catch (error) {
reject(error);
}
}, 0);
});
}
});
return promise2;
}
catch(onRejected) {
return this.then(null, onRejected);
}
}
const 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;
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);
}
};
```
这个实现代码中,我们首先定义了一个 Promise 类,其构造函数接受一个 executor 函数,如果在 executor 函数中调用了 resolve 方法,则 Promise 的状态会变为 fulfilled,如果调用了 reject 方法,则 Promise 的状态会变为 rejected。
在 then 方法中,我们首先对 onFulfilled 和 onRejected 进行了类型判断,然后根据当前 Promise 的状态,分别执行对应的回调函数。如果当前 Promise 的状态是 pending,我们则将回调函数存储到 onFulfilledCallbacks 或 onRejectedCallbacks 中,等待 Promise 的状态发生变化后再执行。
在 resolvePromise 方法中,我们首先判断 x 是否等于 promise2,如果是则说明出现了循环引用的情况,直接抛出错误。然后我们判断 x 是否为对象或函数,如果是,则尝试获取其 then 方法。如果获取到了,则调用 then 方法,并将 resolve 和 reject 方法作为参数传递给 then 方法。如果 then 方法返回值仍然是一个 Promise,则递归调用 resolvePromise 方法,直到返回值不为 Promise 为止。否则,直接将返回值作为 Promise 的结果传递给下一个 then 方法。如果 x 不是对象或函数,则直接将其传递给下一个 then 方法。