promise
// resolve()會觸發then方法第一個回調, reject()會觸發then方法第二個回調或catch方法
let p = new Promise((resolve, reject) => {
setTimeout(() => {
if (Math.random() > 0.5) {
resolve("成功操做");
} else {
reject("失敗操做");
}
});
});
p.then(
res => {
console.log(res);
},
err => {
console.log(err);
}
);
generator
// yield會終止fn()的執行,須要next()方法觸發fn()向下執行
function* fn(x) {
yield x[0];
yield x[1];
yield x[2];
}
let res;
let t = fn([1, 2, 3]);
do {
res = t.next();
console.log(res);
} while (!res.done);
// 執行結果
// { value: 1, done: false }
// { value: 2, done: false }
// { value: 3, done: false }
// { value: undefined, done: true }
實現promise
// Promise的參數是一個函數async,async()有resolve和reject兩個參數
function Promise(async) {
// 回調函數中this會指向window,須要保存纔會指向Promise實例對象
let _this = this;
// Promise三種狀態,分別爲pending,resolved,rejected.狀態只能從pending變成resolved或者rejected
_this.status = "pending";
_this.val = undefined;
// 成功回調方法集合
_this.onResolvedCallbacks = [];
// 失敗回調方法集合
_this.onRejectedCallbacks = [];
// 觸發resolve()方法異步狀態改變成成功, 將會執行成功回調集合中的方法
function resolve(val) {
if (_this.status === "pending") {
_this.status = "resolved";
_this.val = val;
_this.onResolvedCallbacks.forEach(item => item(val));
}
}
// 觸發reject()方法異步狀態改變成失敗, 將會執行失敗回調集合中的方法
function reject(val) {
if (_this.status === "pending") {
_this.status = "rejected";
_this.val = val;
_this.onRejectedCallbacks.forEach(item => item(val));
}
}
// 異常捕獲
try {
async(resolve, reject);
} catch (err) {
reject(err);
}
}
// then方法有兩個參數, 第一個異步成功後執行的函數, 第二個是異步出異常後執行的函數
Promise.prototype.then = function(resolved, rejected) {
let _this = this;
if (_this.status === "pending") {
// 將全部then要執行的方法push到回調函數集合中,在狀態改成resolved執行其中的方法
_this.onResolvedCallbacks.push(resolved);
// 將全部then要執行的方法push到回調函數集合中,在狀態改成rejected執行其中的方法
_this.onRejectedCallbacks.push(rejected);
}
if (_this.status === "resolved") {
resolved(_this.val);
}
if (_this.status === "rejected") {
rejected(_this.val);
}
};
實現generator
// 生成器
function fn(val) {
let i = 0;
return {
next() {
let done = i === val.length;
let value = val[i++];
return {
value,
done
};
}
};
}
// 迭代器
let it = fn([1, 2, 3]);
let result;
do {
result = it.next();
console.log(result);
} while (!result.done);