Javascript/ES6的Promise, Iterator和Generator

  ES6/ES2015原生支持promise,一个 promise对象是一个等待异步操作完成的对象,当操作完成后,promise要么表示执行成功要么表示失败。

标准创建一个Promise方法是使用new Promise()构造器,能接受一个带有两个函数参数哦处理器,第一个处理器典型称为resolve是当准备就绪时使用一个future未来值调用,而另外一个处理器典型称为reject,是在其不能resolve决定future值时用来拒绝Rpomise。

var p = new Promise(function(resolve, reject) {  
    if (/* condition */) {
        resolve(/* value */);  // fulfilled successfully 
    }
    else {
        reject(/* reason */);  // error, rejected 
    }
});

 

每个Promise都有一个方法名为then,会将一对回调函数作为输入参数,第一个回调是成功时调用,另外一个是拒绝时调用:

p.then((val) => console.log("Promise Resolved ", val),
       (err) => console.log("Promise Rejected ", err));

 

Iterator

能够用来遍历集合中元素,按照其在集合中顺序跟踪遍历的一个个位置,而Iterable是一个返回指定iterator对象的对象群,一个iterator是一个带有下一个属性的对象,返回的是调用Symbol.iterator方法的结果,我们能使用Object.leys构建一个带有我们对象属性名的数组。

 

let post = {  
  title: 'Some title',
  replies: 19
};
post[Symbol.iterator] = function () {  
  let properties = Object.keys(this);
  let count = 0;
  let idDone = false;  
   let next = () => {
    if(count <= properties.length){
      isDone = true; 
    }
      return { done: isDone, value: this[properties[count++]] };
   };
   return { next };
}; 
 

 

Generator

Generator函数是一种特殊函数,我们能够使用yield关键词返回iterator对象。

下面函数带有星号*的声明是定义Generator函数:

function * nameList() {  
  yield "Sam";
  yield "Tyler";
} 

 

调用这种函数返回的是一个genrator对象:

for(let name of nameList()){
      console.log(name);
  }

我们能使用generator替代iterator代码,需要包括星号*的函数签名和yield关键词:

post[Symbol.iterator] = function * () {  
  let properties = Object.keys(this);
   for(let p of properties){
    yield this[p];
  }
}; 

 

generator能够根据要求再计算yield的值,因此在CPU密集型序列或无限序列中能够有效率地使用。

 

function *infiniteNumbers() {
    var n = 1;
    while (true){
        yield n++;
    }
}
 
var numbers = infiniteNumbers(); // returns an iterable object 
 
numbers.next(); // { value: 1, done: false } 
numbers.next(); // { value: 2, done: false } 
numbers.next(); // { value: 3, done: false } 

 

Javascript/ES6 Promise用法

Javascript6简明手册