promise有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败),状态只能从pending变为fulfilled或rejected,且一旦改变不可逆转;当调用resolve时,状态由pending转为fulfilled,调用reject时转为rejected,此后状态不再变化。

Promise本质上是一种处理异步操作的模式,它代表着一个尚未完成的异步操作的结果。JS实现Promise的关键在于模拟Promise的状态管理和链式调用。
class MyPromise {
constructor(executor) {
this.state = 'pending';
this.value = undefined;
this.reason = undefined;
this.onResolvedCallbacks = [];
this.onRejectedCallbacks = [];
const resolve = (value) => {
if (this.state === 'pending') {
this.state = 'fulfilled';
this.value = value;
this.onResolvedCallbacks.forEach(fn => fn(value));
}
};
const reject = (reason) => {
if (this.state === 'pending') {
this.state = 'rejected';
this.reason = reason;
this.onRejectedCallbacks.forEach(fn => fn(reason));
}
};
try {
executor(resolve, reject);
} catch (err) {
reject(err);
}
}
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.state === 'fulfilled') {
setTimeout(() => { // 模拟异步
try {
const x = onFulfilled(this.value);
resolvePromise(promise2, x, resolve, reject);
} catch (e) {
reject(e);
}
}, 0);
}
if (this.state === 'rejected') {
setTimeout(() => {
try {
const x = onRejected(this.reason);
resolvePromise(promise2, x, resolve, reject);
} catch (e) {
reject(e);
}
}, 0);
}
if (this.state === 'pending') {
this.onResolvedCallbacks.push(() => {
setTimeout(() => {
try {
const x = onFulfilled(this.value);
resolvePromise(promise2, x, resolve, reject);
} catch (e) {
reject(e);
}
}, 0);
});
this.onRejectedCallbacks.push(() => {
setTimeout(() => {
try {
const x = onRejected(this.reason);
resolvePromise(promise2, x, resolve, reject);
} catch (e) {
reject(e);
}
}, 0);
});
}
});
return promise2;
}
catch(onRejected) {
return this.then(null, onRejected);
}
finally(callback) {
return this.then(
value => MyPromise.resolve(callback()).then(() => value),
reason => MyPromise.resolve(callback()).then(() => { throw reason })
);
}
static resolve(value) {
return new MyPromise((resolve, reject) => {
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;
if (promises.length === 0) {
resolve(results);
return;
}
for (let i = 0; i < promises.length; i++) {
const promise = promises[i];
MyPromise.resolve(promise).then(
value => {
results[i] = value;
count++;
if (count === promises.length) {
resolve(results);
}
},
reason => {
reject(reason);
}
);
}
});
}
static race(promises) {
return new MyPromise((resolve, reject) => {
for (let i = 0; i < promises.length; i++) {
const promise = promises[i];
MyPromise.resolve(promise).then(
value => {
resolve(value);
},
reason => {
reject(reason);
}
);
}
});
}
}
function resolvePromise(promise2, x, resolve, reject) {
if (promise2 === x) {
return reject(new TypeError('Chaining cycle detected for promise #<Promise>'));
}
let called;
if ((typeof x === 'object' && x !== null) || 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 {
if (called) return;
called = true;
resolve(x);
}
} catch (e) {
if (called) return;
called = true;
reject(e);
}
} else {
resolve(x);
}
}
// Example usage:
const promise = new MyPromise((resolve, reject) => {
setTimeout(() => {
resolve('Hello, Promise!');
}, 1000);
});
promise.then(value => {
console.log(value); // Output: Hello, Promise!
return 'Chained value';
}).then(value => {
console.log(value); // Output: Chained value
}).catch(err => {
console.error(err);
});Promise有三种状态:
pending
fulfilled
rejected
pending
fulfilled
pending
rejected
resolve(value)
fulfilled
value
then
reject(reason)
rejected
reason
then
fulfilled
rejected
pending
fulfilled
rejected
在Promise链中,错误处理通常通过
catch
then
catch
then(null, onRejected)
catch
catch
onFulfilled
catch
promise
.then(value => {
// ...
})
.then(value => {
// ...
throw new Error('Something went wrong'); // 抛出错误
})
.catch(error => {
console.error('Error:', error); // 捕获错误
});then
then
onRejected
promise
.then(
value => {
// ...
},
error => {
console.error('Error:', error); // 捕获promise的错误
}
);错误冒泡: 如果在Promise链的某个环节没有提供错误处理,错误会沿着Promise链向下冒泡,直到遇到
catch
onRejected
Promise.all
Promise.race
Promise.all(promises)
行为: 接收一个Promise数组(或任何可迭代对象),并返回一个新的Promise。只有当数组中所有的Promise都成功
fulfilled
fulfilled
value
value
rejected
rejected
rejected
reason
reason
适用场景: 适用于需要等待所有异步操作完成后才能进行下一步操作的场景。例如,需要并行请求多个API,只有当所有API都返回数据后才能渲染页面。
示例:
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); // Output: [1, 2, 3]
})
.catch(error => {
console.error(error);
});Promise.race(promises)
行为: 接收一个Promise数组(或任何可迭代对象),并返回一个新的Promise。返回的Promise会采用数组中第一个
fulfilled
rejected
适用场景: 适用于只需要一个异步操作完成即可的场景。例如,设置请求超时,如果请求在规定时间内没有返回,就使用一个reject的Promise来取消请求。
示例:
const promise1 = new Promise(resolve => setTimeout(() => resolve('Promise 1'), 500));
const promise2 = new Promise(resolve => setTimeout(() => resolve('Promise 2'), 100));
Promise.race([promise1, promise2])
.then(value => {
console.log(value); // Output: Promise 2 (因为promise2先完成)
})
.catch(error => {
console.error(error);
});简而言之,
Promise.all
Promise.race
以上就是JS如何实现Promise?Promise的原理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号