<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="X-UA-Compatible" content="ie=edge" />
<title>promise</title>
</head>
<body></body>
<script>
function Promise(exector) {
let self = this;
this.status = 'pending';
this.catchCallbacks = [];
this.suceeseCallbacks = [];
this.value = '';
this.reson = '';
function resolve(value) {
self.value = value;
self.status = 'resolve';
console.log("resolve");
self.suceeseCallbacks.forEach(element => {
var returnvalue = element(self.value);
returnvalue && (self.value = returnvalue);
});
}
function reject() {
self.status = 'reject';
self.catchCallbacks.forEach(element => {
var returnvalue = element(self.reson);
returnvalue && (self.reson = returnvalue);
});
}
try {
exector(resolve, reject);
} catch (e) {
reject(e);
}
}
// let p = new Promise((resolve, reject) => {
// console.log("pending");
// setTimeout(() => {
// resolve("成功");
// }, 1000);
// });
Promise.prototype.then = function(then, err) {
// console.log(this.suceeseCallbacks);
this.catchCallbacks.push(err);
this.suceeseCallbacks.push(then);
if (this.status === 'resolve') {
then(this.value);
}
return this;
};
Promise.prototype.catch = function(err) {
this.catchCallbacks.push(err);
if (this.status === 'reject') {
err(this.reson);
}
return this;
};
// p.then(res => {
// console.log("then", "res", res);
// });
Promise.all = function(arr) {
console.log(arr);
return new Promise(function(resolve, reject) {
let count = 0;
var result = [];
// resolve([12, 321]);
arr.forEach((item, index) => {
console.log(index);
item.then(function(res) {
result[index] = res;
count++;
console.log(count === arr.length, arr.length, result, count);
// console.log('forEach resolve');
if (count == arr.length) {
console.log('forEach resolve');
resolve(result);
// console.log('forEach resolve');
}
});
});
});
};
var p = new Promise(function(resolve, reject) {
setTimeout(() => {
resolve(12);
}, 1000);
});
// p.then(res => {
// console.log(res, 'res')
// })
Promise.all([p, p, p, p])
.then(res => {
console.log(res, 'allres');
})
.catch(err => {
console.log(err);
});
</script>
</html>
手写Promise
最新推荐文章于 2022-05-16 09:35:24 发布