资讯专栏INFORMATION COLUMN

es6常用知识(三) prosime和generator

flybywind / 2552人阅读

摘要:异步执行可以用回调函数实现。全成功也可以通过解构数组的方式,将展开赋值。可以依次拿到每个结果。放弃暂时放弃执行相当于创建了一个对象。代表是否完成,代表函数完成,已经到终点。是因为最终的结果需要在最后的时候返回最终结果

prosime

在JavaScript的世界中,所有代码都是单线程执行的。
由于这个“缺陷”,导致JavaScript的所有网络操作,浏览器事件,都必须是异步执行。异步执行可以用回调函数实现。

1 promise 翻译过来是 承诺的意思。
异步:操作之间没啥关系。同时进行多个操作。
同步:同时只能做一件事情。
异步的缺点就是,代码复杂,一层套一层,如果需要执行很多个异步操作都完成在执行某个事情,那么就要嵌套很多层,代码可读性差,不好维护。如:

</>复制代码

  1. // 异步
  2. ajax("/bannders",function(bannder_data){
  3. ajax("/hotItems",function(hotItems_data){
  4. ajax("/slides",function(slides_data){
  5. },function(){
  6. alert("读取失败")
  7. })
  8. },function(){
  9. alert("读取失败")
  10. })
  11. },function(){
  12. alert("读取失败")
  13. })

同步:代码简单 ,写起来方便

</>复制代码

  1. // 同步
  2. let bannder_data=ajax_async("/bannders")
  3. let hotItems_data=ajax_async("/hotItems")
  4. let slides_data=ajax_async("/slides")

可是同步虽然写法简单,但是每个步骤需要等待上一个操作结束,所以实际项目中需要的是异步(不等待)的操作。
于是prosime出现了,他的作用就是:

消除异步操作

用同步一样的方式来书写异步代码

1.Prosime到底怎么用

prosime是es6自带的。需要的用prosime的时候,可以直接new出来一个peomise对象。promise里面有一个参数,这个参数是函数,所有的异步操作代码都写在这个函数里面。这个函数有两个参数,一个是resolve(成功),另外一个是reject(失败)。例如:

</>复制代码

  1. var p=new Promise(function (resolve,reject) {
  2. 异步代码
  3. resolve--成功
  4. reject---失败
  5. $.ajax({
  6. url:"data/arr.txt",
  7. dataType:"json",
  8. success(arr){
  9. resolve(arr)
  10. },
  11. error(err){
  12. reject(err)
  13. }
  14. })
  15. })
  16. promise的使用:p里面的then方法的意思是然后呢?就是当peomise对象执行之后有结果了,
  17. 之后执行。then里面有两个参数,都是函数,第一个函数其实就是resolve对应的结果。
  18. 第二个函数就是reject对象的结果。
  19. p.then(function(arr){
  20. console.log("成功了",arr)
  21. },function(err){
  22. console.log("失败了",err)
  23. })
2.封装两个promise

</>复制代码

  1. var p1=new Promise(function (resolve,reject) {
  2. 异步代码
  3. resolve--成功
  4. reject---失败
  5. $.ajax({
  6. url:"data/arr.txt",
  7. dataType:"json",
  8. success(arr){
  9. resolve(arr)
  10. },
  11. error(err){
  12. reject(err)
  13. }
  14. })
  15. })
  16. var p2=new Promise(function (resolve,reject) {
  17. 异步代码
  18. resolve--成功
  19. reject---失败
  20. $.ajax({
  21. url:"data/json.txt",
  22. dataType:"json",
  23. success(arr){
  24. resolve(arr)
  25. },
  26. error(err){
  27. reject(err)
  28. }
  29. })
  30. })
  31. promie上有一个方法all,就是全都执行完以后,all的参数是一个数组,是所以的promise对象,
  32. 之后then方法里面有两个参数,都是函数,第一个函数其实就是全都成功以后,其函数的参数就是返回所有resolve结果。,第二个函数是只是有一个失败了。:
  33. Promise.all([p1,p2]).then(function(arr){
  34. alert("全成功")
  35. console.log(arr)
  36. 也可以通过解构数组的方式,将arr展开赋值。可以依次拿到 每个resolve结果。
  37. let [p1,p2]=arr
  38. console.log(p1)
  39. console.log(p2)
  40. },function(){
  41. alert("至少有一个失败")
  42. })

Promise的二次封装,createPromise,抽出可变的URL即可。

</>复制代码

  1. function createPromise(url) {
  2. return new Promise(function (resolve, reject) {
  3. // 异步代码
  4. // resolve--成功
  5. // reject---失败
  6. $.ajax({
  7. url,// url:url json 值和名相同可简写,
  8. dataType: "json",
  9. success(arr) {
  10. resolve(arr)
  11. },
  12. error(err) {
  13. reject(err)
  14. }
  15. })
  16. })
  17. }
  18. // promie上有一个方法all,就是全都执行完以后,all的参数是一个数组,是所以的promise对象,
  19. // 之后then方法里面有两个参数,都是函数,第一个函数其实就是全都成功以后,其函数的参数就是返回所有resolve结果。,第二个函数是只是有一个失败了。:
  20. Promise.all([createPromise("data/arr.txt"), createPromise("data/json.txt")]).then(function (arr) {
  21. alert("全成功")
  22. console.log(arr)
  23. // 也可以通过解构数组的方式,将arr展开赋值。可以依次拿到 每个resolve结果。
  24. let [p1, p2] = arr
  25. console.log(p1)
  26. console.log(p2)
  27. }, function () {
  28. alert("至少有一个失败!")
  29. })
generator (生成器) 1.什么是generaor函数。

Generator函数是一个带星星函数(星号和function和函数名不能同时连接接口),而且是一个可以暂停的函数。
函数的内部通过yield来推进函数。通过定义yield后面的值来决定返回的value。
函数返回一个遍历器,这个遍历器有一个next方法,可以获取一个对象,这个对象就包含了yield定义好的参数。

</>复制代码

  1. function *show(){
  2. alert("a")
  3. yield; //放弃(暂时放弃执行)
  4. alert("b")
  5. }
  6. let genObj=show() //相当于创建了一个generator对象。
  7. //这个对象里有一个很重要的东西next(),就是下一步,下一步。
  8. //就是踹一脚走一步。
  9. genObj.next() //执行一步之后,看到yield之后,就停止执行了。
  10. //如果想让alert(’b‘)出来就需要next两步。
  11. genObj.next()

普通函数 ----一路到底
generator函数---中间能停

2.yield的传参

2.1第一个next是废的,不能传参。

</>复制代码

  1. // yield可以传参
  2. function *show(){
  3. alert("a");
  4. let a=yield;
  5. alert("b");
  6. alert(a);
  7. }
  8. let gen=show();
  9. gen.next(12); //通过yield传参的时候,第一个next是废的,传传不了,如果想给第一个yield传参,
  10. //通过函数就可以传参
  11. gen.next(5);

2.2给第一个yield传参,就直接通过函数传参就可以了

</>复制代码

  1. // 给第一个yield传参,就直接通过函数传参就可以了。
  2. function *show(num1,num2){
  3. alert(`${num1},${num2}`)
  4. alert("a");
  5. let a=yield;
  6. alert("b");
  7. alert(a);
  8. }
  9. let gen=show(98,97);
  10. gen.next(12); //通过yield传参的时候,第一个next是废的,传传不了,如果想给第一个yield传参,
  11. //通过函数就可以传参
  12. gen.next(5);
3 yield的返回值。

3.1 done代表是否完成

</>复制代码

  1. function * show (){
  2. alert("a")
  3. yield 12;
  4. alert("b")
  5. }
  6. let gen =show()
  7. let res1=gen.next()
  8. console.log(res1)// {done:false, value:12} //done 代表是否完成,代表函数没完成,没到终点。
  9. let res2=gen.next()
  10. console.log(res2) // {done:true, value:undefind} //done 代表是否完成,true代表函数完成,已经到终点。undefind是因为最终的结果需要在
  11. // generator最后的时候return 返回最终结果

3.2 generator最后的return是返回最终结果

</>复制代码

  1. function * show (){
  2. alert("a")
  3. yield 12; //yield返回
  4. alert("b")
  5. return 100
  6. }
  7. let gen =show()
  8. let res1=gen.next()
  9. console.log(res1)// {done:false, value:12} //done 代表是否完成,代表函数没完成,没到终点。
  10. let res2=gen.next()
  11. console.log(res2) // {done:true, value:100} //done 代表是否完成,true代表函数完成,已经到终点。undefind是因为最终的结果需要在
  12. // generator最后的时候return 返回最终结果

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/94714.html

相关文章

  • ES6-7

    摘要:的翻译文档由的维护很多人说,阮老师已经有一本关于的书了入门,觉得看看这本书就足够了。前端的异步解决方案之和异步编程模式在前端开发过程中,显得越来越重要。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。 JavaScript Promise 迷你书(中文版) 超详细介绍promise的gitbook,看完再不会promise...... 本书的目的是以目前还在制定中的ECMASc...

    mudiyouyou 评论0 收藏0
  • ES6常用知识点概述

    摘要:那之前的例子来使用一下的话,你会发现浏览器报错了,如图定义的变量不允许二次修改。如图箭头函数没有它自己的值,箭头函数内的值继承自外围作用域。如图这里两边的结构没有一致,如果是的话,是可以正常解构的。 前言 国庆假期已过一半,来篇干货压压惊。 ES6,并不是一个新鲜的东西,ES7、ES8已经赶脚了。但是,东西不在于新,而在于总结。每个学前端的人,身边也必定有本阮老师的《ES6标准入门》或...

    keithyau 评论0 收藏0
  • 从0到1使用VUE-CLI3开发实战(): ES6/ES7知识储备

    摘要:它们都用于声明变量。盲目使用替换后可能会导致预期意外的结果。有鉴于此,还是建议使用字符串,布尔和数字类型的数据类型。像使用这种下划线命名约定在一个开源项目中,命名规则很难维持得一直很好,这样经常会造成一些困扰。 今天群里有小伙伴跟我聊天,问了我几个关于ES6的问题,我才意识到,大部分初学者在学习的过程中,都是学了HTML/CSS/JS之后就开始上手学习框架了,而对于ES6的重视程度却不...

    crossoverJie 评论0 收藏0
  • ES6 常用知识点总结

    摘要:常用知识总结之前总结了中的一些知识点。在年正式发布了,简称,又称为。作为构造函数的语法糖,同时有属性和属性,因此同时存在两条继承链。子类的属性,表示构造函数的继承,总是指向父类。 ES6常用知识总结 之前总结了es5中js的一些知识点。这段时间看了石川blue老师讲解的es6课程,结合阮一峰老师的es6教程,随手做了一些笔记和总结分享给大家。内容还是es6主要的知识点,基本没有什么创新...

    leap_frog 评论0 收藏0

发表评论

0条评论

flybywind

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<