Promise对象是一个构造函数,用来生成Promise实例
var promise = new Promise((resolve, reject) => {
// 异步操作,如调个api
if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
})
resolve函数改变promise状态从Pending(未完成)变为Resolved
reject函数从Pending变为Rejected
promise实例的then方法
作用: 指定Resolved状态和Reject状态的回调函数
promise.then(function(value) {
// success
}, function(error) {
// failure
});
Generator函数
协程的方式解决异步问题
第一步,协程A开始执行。
第二步,协程A执行到一半,进入暂停,执行权转移到协程B。
第三步,(一段时间后)协程B交还执行权。
第四步,协程A恢复执行。
上面流程的协程A,就是异步任务,因为它分成两段(或多段)执行。
Generator函数最大特点就是可以交出函数的执行权(即暂停执行)
它不是一个普通的函数,函数名之前要加星号如
function* gen(x){
var y = yield x + 2;
return y
}
Generator函数的执行
var g = get(1);
g.next(); // { value: 3, done: false }
g.next(); // { value: undefined, done: true }
- 第一个next()方法,返回 x+2
yield语句本身没有返回值,或者说返回的是undefined
所以些时y是undefined
- 第二个next()方法,返回return后面的值y,所以它是undefined
每次调用next方法时指针从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield语句(或return语句)为止
next 方法
遇到yield这个关键词时,就将跟在它后面的表达式的值,作为返回对象的value的值
下一次调用next方法时,再继续往下执行,直到遇到下一个yield语句。
如果没有再遇到新的yield语句,就一直运行到函数结束,直到return语句为止,并将return语句后面的表达式的值,作为返回的对象的value属性值。
如果该函数没有return语句,则返回的对象的value属性值为undefined。
正常函数只能返回一个值,因为只能执行一次return;Generator函数可以返回一系列的值,因为可以有任意多个yield。从另一个角度看,也可以说Generator生成了一系列的值,这也就是它的名称的来历(在英语中,generator这个词是“生成器”的意思)。
next 方法的参数
yield句本身没有返回值,或者说总是返回undefined。next方法可以带一个参数,该参数就会被当作上一个yield语句的返回值
所以如果第一个next()方法我们加一个5的参数
g.next(5) // {value: 5, done: true}
这里第一个yield会把5给y,我们第二个再获取时,y就已经是5了
因为返回的是第一个yield的返回值,所以第一个next()方法是不能带参数的。
for of循环
function* gen() {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
return 6
}
for(let i of gen()){
console.log(i)
}
// 1,2,3,4,5
for of可以遍历generator函数,不需要调next,但是需要注意的是一旦next返回的done为true,它就停止了,并且连done为true的这个对象也不返回了
g.return() 方法
g.return('hello') 当碰到这个时返回的对象是{value:'hello', done: true}
表示已经对遍历的终止