Promise的源码
时间: 2023-11-30 19:39:28 浏览: 33
Promise是一种用于异步编程的解决方案,它的源码实现可以在浏览器中找到。下面是Promise的部分源码,完整源码可以在github中下载:
```javascript
function Promise(executor) {
if (typeof executor !== 'function') {
throw new TypeError('Promise constructor argument is not a function');
}
if (!(this instanceof Promise)) {
throw new TypeError('Promise must be called with "new"');
}
var self = this;
self.state = 'pending';
self.value = undefined;
self.reactions = [];
function resolve(value) {
if (self.state !== 'pending') {
return;
}
self.state = 'fulfilled';
self.value = value;
for (var i = 0; i < self.reactions.length; i++) {
self.reactions[i].fulfill(self.value);
}
}
function reject(reason) {
if (self.state !== 'pending') {
return;
}
self.state = 'rejected'; self.value = reason;
for (var i = 0; i < self.reactions.length; i++) {
self.reactions[i].reject(self.value);
}
}
try {
executor(resolve, reject);
} catch (e) {
reject(e);
}
}
Promise.prototype.then = function(onFulfilled, onRejected) {
var self = this;
var promise2;
if (self.state === 'fulfilled') {
promise2 = new Promise(function(resolve, reject) {
try {
var x = onFulfilled(self.value);
resolve(x);
} catch (e) {
reject(e);
}
});
} else if (self.state === 'rejected') {
promise2 = new Promise(function(resolve, reject) {
try {
var x = onRejected(self.value);
resolve(x);
} catch (e) {
reject(e);
}
});
} else {
promise2 = new Promise(function(resolve, reject) {
self.reactions.push({
fulfill: function(value) {
try {
var x = onFulfilled(value);
resolve(x);
} catch (e) {
reject(e);
}
},
reject: function(reason) {
try {
var x = onRejected(reason);
resolve(x);
} catch (e) {
reject(e);
}
}
});
});
}
return promise2;
};
```
Promise的源码实现包括了Promise构造函数和then方法。在构造函数中,Promise会初始化状态、值和reactions数组,并且定义了resolve和reject方法来处理Promise的状态和值。在then方法中,Promise会根据当前状态来执行不同的逻辑,并返回一个新的Promise对象。