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 }