Promise
1. Promise实例对象
- 用法1 调用 resolve 方法,返回一个成功的 promise 对象
const p1 = new Promise((resolve, reject) => {
resolve("hello");
});
p1.then(
(res) => {
console.log(res);
},
(err) => {
console.log(err);
}
);
- 用法2 调用 reject 方法,返回一个失败的 promise 对象
const p2 = new Promise((resolve, reject) => {
reject("err");
});
p2.then(
(res) => {
console.log(res);
},
(err) => {
console.log(err);
}
);
p2.then((res) => {
console.log(res);
}).catch((err) => {
console.log(err);
});
- 用法3 then 方法返回 promise 对象,可以无限调用 then 方法
const p3 = new Promise((resolve, reject) => {
resolve("第一个值");
});
p3.then((res) => {
return new Promise((resolve, reject) => {
console.log(res);
resolve("第二个值");
});
}).then((res) => {
console.log(res);
});
Promise.resolve()
- 直接返回一个 成功的 promise 对象
const p4 = Promise.resolve("success");
p4.then(res => {
console.log(res);
}, err => {
console.log(err);
})
Promise.reject();
- 返回一个失败的 promise 对象
const p4 = Promise.resolve("error");
p4.then(res => {
console.log(res);
}, err => {
console.log(err);
})
Promise.all([p1, p2, p3])
- Promise.all 传入 一个包含 promise 对象的数组,只有全部返回成功,则结果返回一个成功的数组。否则只要有一个失败,则返回失败的 promise 对象的值。
const p5 = new Promise((resolve, reject) => {
resolve("hello1");
});
const p6 = Promise.resolve("hello2");
const result = Promise.all([p5, p6]);
console.log(result);
const p9 = Promise.reject("error");
const result = Promise.all([p5, p6, p9]);
console.log(result);
Promise.race([p1, p2, p3])
- 根据第一个 promise 返回结果来确认promise对象值。
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
resolve("成功")
}, 2000);
});
const p2 = Promise.reject("失败");
const result = Promise.race([p1, p2]);
手写promise方法(简单版)
function Promise(executor) {
this.PromiseState = "pending";
this.PromiseResult = null;
this.callback = {};
const self = this;
function resolve(data) {
if (self.PromiseState !== "pending") return;
self.PromiseState = "fulfilled";
self.PromiseResult = data;
if (self.callback.onResolved) {
self.callback.onResolved(data);
}
}
function reject(data) {
if (self.PromiseState !== "pending") return;
self.PromiseState = "rejected";
self.PromiseResult = data;
if (self.callback.onRejected) {
self.callback.onRejected(data);
}
}
try {
executor(resolve, reject);
} catch (e) {
reject(e);
}
}
Promise.prototype.then = function (onResolved, onRejected) {
if (this.PromiseState == "fulfilled") {
onResolved(this.PromiseResult);
}
if (this.PromiseState == "rejected") {
onRejected(this.PromiseResult);
}
if (this.PromiseState == "pending") {
this.callback.push({ onResolved, onRejected });
}
};