前端异步解决方案-4.2(generator+promise)

栏目: JavaScript · 发布时间: 7年前

内容简介:为什么要实现generator和promise的结合呢?大部分网上的文章都说是为了更简单的处理错误,不过这个我暂时还没有感悟,我反而觉得其实差不多;但是还是先学习一下用法吧;先从简单的用法讲起:

为什么要实现generator和promise的结合呢?

大部分网上的文章都说是为了更简单的处理错误,不过这个我暂时还没有感悟,我反而觉得其实差不多;但是还是先学习一下用法吧;

先从简单的用法讲起:

//最简单的用法
function request() {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      let num = Math.random();
      if (num > 0.9) {
        reject(num + "request err")
      } else {
        resolve(num * 100);
      }
    }, 100)
  })
}

let it = gen();
let p = it.next().value;// 在yield处被返回的Promise 被赋给了 p
p.then(res => it.next(res).value, err => it.throw(err));// 发生错误时,将错误抛入生成器(gen)中

function* gen() {
  try {
    let response = yield request();
    console.log(response.text);
  } catch (error) {
    console.log('Ooops, ', error.message); // 可以捕获Promise抛进来的错误!}}
  }
}

这里request的写法就是普通的Promise异步的写法,而gen中异步的写法就已经非常像同步了,唯一一个缺点就是中间这一段代码在我们多次异步的时候,我们需要不断的加长就像这样

function request(){
//同上,我就不写了
}
let it = gen();
let p = it.next().value;
//在res中返回了it.next(res).value,而这又是一个promise对象,这样的话就可以通过promise.then()的链式调用来写了
p.then(res => it.next(res).value, err => it.throw(err))        
  .then(res => it.next(res).value, err => it.throw(err));

function* gen() {
  try {
    let response = yield request();
    console.log(response);
    let response2 = yield request();
    console.log(response,response2);
  } catch (error) {
    console.error('Ooops', error); // 可以捕获Promise抛进来的错误!}}
  }
}

这样就是不是很美了对吧,毕竟一直要写重复的代码。所以我们再写一个辅助generator自动跑的函数;

//generator 自动运行函数,但是要求改generator yield 后面跟的必须是promise对象
let genRun = function () {
  function run(p, gen) {
    p.then(resolve => {
      p = gen.next(resolve).value;
      if (p !== undefined) {
        run(p, gen)
      }
    }, reject => {
      p = gen.throw(reject).value;
    })
  }

  return function (generator) {
    let g = generator();
    run(g.next().value, g)
  }
}();

function request() {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      let num = Math.random();
      if (num > 0.8) {
        reject(num + "request err")
      } else {
        resolve(num * 100);
      }
    }, 100)
  })
}


genRun(function* () {
  try {
    let response1 = yield request();
    console.log("response1", response1);
    let response2 = yield request();
    console.log("response2", response2);
    let response3 = yield request();
    console.log("response3", response3);
  } catch (e) {
    console.error(e)
  }
});

这样只要我们保证request返回的是一个 Primise 对象那么我们的异步代码就可以写的异常的轻松了;

这一篇文章解释的注释不多,主要是因为这两天太累了,以后有空再回来补辅助理解的注释,还请各位看官老爷给个赞鼓励一下,让我有继续写下去的动力;


以上所述就是小编给大家介绍的《前端异步解决方案-4.2(generator+promise)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Modeling the Internet and the Web

Modeling the Internet and the Web

Pierre Baldi、Paolo Frasconi、Padhraic Smyth / Wiley / 2003-7-7 / USD 115.00

Modeling the Internet and the Web covers the most important aspects of modeling the Web using a modern mathematical and probabilistic treatment. It focuses on the information and application layers, a......一起来看看 《Modeling the Internet and the Web》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码