Promise、Generator 函数

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 }
  1. 第一个next()方法,返回 x+2

yield语句本身没有返回值,或者说返回的是undefined
所以些时y是undefined

  1. 第二个next()方法,返回return后面的值y,所以它是undefined

每次调用next方法时指针从函数头部或上一次停下来的地方开始执行,直到遇到下一个yield语句(或return语句)为止

next 方法
  1. 遇到yield这个关键词时,就将跟在它后面的表达式的值,作为返回对象的value的值

  2. 下一次调用next方法时,再继续往下执行,直到遇到下一个yield语句。

  3. 如果没有再遇到新的yield语句,就一直运行到函数结束,直到return语句为止,并将return语句后面的表达式的值,作为返回的对象的value属性值。

  4. 如果该函数没有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}
表示已经对遍历的终止

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容