ES6的基礎知識(三)

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);
相關文章
相關標籤/搜索