首页 > 其他分享 > 开课吧前端1期.阶段2:ES6详解-4 Promise generator-认识生成器函数 generator-yield

开课吧前端1期.阶段2:ES6详解-4 Promise generator-认识生成器函数 generator-yield

时间:2023-09-10 11:22:56浏览次数:43  
标签:function ES6 arr generator 生成器 alert ajax Promise let

10、Promise

  • Promise -- 承诺
    • 异步: 操作之间没啥关系,同时进行多个操作
    • 同步: 同时只能做一件事
  • 优缺点
    • 异步:代码更复杂
    • 同步:代码简单  

 

//比如我要请求4个数据,真正生产还要判断,没法看了,缩进
//异步:特别麻烦
ajax('/banners',function(banners)){
    ajax('/hotItems',function(hotItems){         
     ajax('/slides',function(slides){
     ajax('/banners',function(banners){
     
     },function(){alert('读取失败')})
     },function(){alert('读取失败')})
     },function(){alert('读取失败')})
    },function(){alert('读取失败')})


//同步
let banners=ajax_async('/banners')
let hotItems=ajax_async('/hotItems')
let slides=ajax_async('/slides')
let banners=ajax_async('/banners')


Promise -- 消除异步操作
*用同步一样的方式,来书写异步代码
    
//Promise到底怎么用
let p = new Promise(function(resolve,reject){
    //异步代码
    //resolve() --成功了
    //reject() --失败了
    $.ajsx({
        url:'arr.txt',
        dataType:'json',
        success(arr){resolve(arr)},
        error(err){reject(err)}
    })
})
//翻译then然后呢,有结果了才调用函数
p.then(function(arr){
    alert('成功'+arr)
},function(err){
    alert('失败'+err)
}); 

调用2个异步

只有当2个promise成功,才算成功

 

let p1 = new Promise(function(resolve,reject){
    //异步代码
    //resolve --成功了
    //reject --失败了
    $.ajsx({
        url:'arr.txt',
        dataType:'json',
        success(arr){resolve(arr)},
        error(err){reject(err)}
    })
})

let p2 = new Promise(function(resolve,reject){
    //异步代码
    //resolve --成功了
    //reject --失败了
    $.ajsx({
        url:'arr.txt',
        dataType:'json',
        success(arr){resolve(arr)},
        error(err){reject(err)}
    })
})
//全都成功才算成功
Promise.all([p1,p2]).then(
 function(arr){
    let[res1,res2] = arr;
    alert('全部成功')},
    alert(res1)
    alert(res2)
 function(){
    alert('至少1个失败')
})
//简写,对Promise进行封装对象
function createPromise(url){
    return new Promise(function(resolve,reject){
    $.ajsx({
        url, //同名简写
        dataType:'json',
        success(arr){resolve(arr)},
        error(err){reject(err)}
    })
})
}

Promise.all([
    create('date/arr.txt'),
    create('date/json.txt')
]).then( function(arr){
    let[res1,res2] = arr;
    alert('全部成功')},
    alert(res1)
    alert(res2)
 function(){
    alert('至少1个失败')
})

jquery,天生带有Promise对象

//jquery,天生带有Promise对象
<script src="jquery.js" charset="utf-8"></script>
let p = $.ajax({url:'data/arr.txt',dataType:'json'})
console.log(p) //p已经封装了Promise

Promise.all([
    $.ajax({url:'data/arr.txt',dataType:'json'}),
    $.ajax({url:'data/json.txt',dataType:'json'})
]).then(function (results){
    let [arr,json]=results; 
    alert('成功了');
    console.log(arr,json); //接收到1个数组,1个json
},function (){
    alert('失败了')
})

Promise其他用法

  • Promise.all // 一个个全都得成功
  • Promise.race -竞速 , 谁先来了用谁

 

//比如5个资源,谁先来了用谁
Promise.race([
    $.ajax({url:'http://1.data'}),
    $.ajax({url:'http://2.data'}),
    $.ajax({url:'http://3.data'}),
    $.ajax({url:'http://4.data'}),
    $.ajax({url:'http://5.data'})
]); 

复习

 

 

11、generator-认识生成器函数

  • 中文是啥意思:
    • generat 【生成】
    • generator 【生成器】
  •  generator是一种特殊的函数,和普通的函数区别:
    • 普通函数 --》 一路到底,运行了中间就不会停
    • generator 函数 --》 中间能停 , 踹一脚走一步

 

//普通函数
function show(){
     alert('a');
     alert('b');
}
show(); //调用,一条路走到底


//星号,generator特点
function *show(){ 
    //*比较随意
       // function* show()  //星号和function一起
    // function  * show() //星号在中间
    
    alert('a');
    //需求,等待一会在往下走
    
    yiele;       //暂时放弃
    alert('b')
}
show()

len genObj = show(); //创建了generator 对象,不会直接执行函数内代码
console.log(genObj)  //输出object Generator
genObj.next()  //alert('a')
genObj.next() //alert('b')

适合场景

function *函数{
   代码...   
   yield ajax(xxx);  //什么时候数据回来了,接着走,【原先:写回调里面】
   代码...
}

背后实现

  • 如何实现走走停停,使用generator 生成一堆的小函数
function show_1(){
    alert('a')
}
function show_2(){
    alert('b')
}
next(); //第1次走show_1
next(); //第2次走show_2

总结

  • generator 简单来说就是能让函数走走停停
  • yield是整个generator里面最不好理解的一个东西,能不能把它掌握了,决定了generator学的好不好

 

 

12 、generator-yield是个啥

  • 重点:yield学好 ,generator也就学好
    • yield:放弃执行的意思
    • yield:既可以传参,也可以返回
//传参
function *show(){  //使用show(num1,num2)传参给 a
    alert('a')
    let a = yield //到这第一个next
    
    alert('b')
    alert(a) //5
} 
let gen = show();
gen.next(12); //第一个传参,都是废的,没法给yield传参
gen.next(5);

中间结果

//中间结果
function *show(){  
    alert('a')
    yield 12
    alert('b')
     return 55; //最终结果
} 
let gen = show();
let res1 = gen.next(12);  
console.log(res1) //{value:12,done:false}  //done意思是函数还没有走完
let res2 = gen.next(5);
console.log(res2) //{value:underfined,done:true}

举例:

 

function *炒菜(菜市场买回来的){
     洗菜 -> 洗好的菜   //第1步洗菜后结果:洗好的菜
    let 干净的菜 = yield 洗好的菜   //中间返回:洗好的菜
    干净的菜->切->丝               //干净的菜,切丝
    let 切好的菜 = yield 丝       //返回:切成丝的菜
    切好的菜 ->炒->熟的菜            
    return 熟的菜
}
*炒菜()

 

标签:function,ES6,arr,generator,生成器,alert,ajax,Promise,let
From: https://www.cnblogs.com/codelives/p/17673959.html

相关文章

  • ES6 Module模块,在vsCode中已服务器模式运行HTML文件
    操作步骤如下:一、安装LiveServer插件二、点击扩展设置三、设置liveserver默认打开浏览器为“chrome”四、配置-工作区五、在HTML文件中,右键选择"openwithLiveServer" 输出结果 ......
  • ES6常见的几种新语法
    1.箭头函数:使用箭头(=>)来定义函数,简化函数的书写方式。2.解构赋值:可以从数组或对象中提取值,并赋给变量。3.扩展运算符:用于展开数组或对象,可以将它们拆分为单独的元素。4.模板字符串:使用反引号(`)来创建字符串,可以在字符串中插入变量或表达式。5.类和对象:引入了类的概念,可以使......
  • Checklist Generator: 革新工作流程的智能清单创建工具
    ChecklistGenerator是一款由人工智能驱动的清单创建工具,它正在彻底改变工作流程。只需输入简短的描述,ChecklistGenerator将为您创建可定制和全面的清单模板,帮助您快速启动为您的业务创建工作流程。概述在如今快节奏的工作环境中,清单是我们提高效率、避免错误和确保任务顺利完......
  • Python 迭代、可迭代对象、迭代器、生成器总结
    迭代对list、tuple、str等类型的数据使用for...in...的循环语法从其中依次拿到数据进行使用,我们把这样的过程称为遍历,也叫迭代可迭代对象不是所有对象都能使用for..in,比如数字10,把可以通过for...in...这类语句迭代读取一条数据供我们使用的对象称之为可迭代对象(Iterable......
  • 开课吧前端1期.阶段2:ES6详解-3 面向对象 JSON
    7、面向对象-基础//原来写法functionUser(name,pass){//这就是一个类this.name=name;this.pass=pass;}User.prototype.showName=function(){alert(this.name)};User.prototype.showPass=function(){alert(this.pass)};varu1=newUser('blue','111......
  • ES6前端技术之第二讲 let和const命令
    第二讲let和const命令前人栽树后人乘凉,前人挖坑后人遭殃!!!JS是弱类型语言,当初设计者为了使用的便捷,开发人员开心,留下了不少坑。请看JS系列坑之技术细节:var关键字挖的坑1.可以重复声明变量vara=88;vara="张老师";console.log(a);填坑:ES,let关键字......
  • Express 应用程序生成器
    Express应用程序生成器通过应用生成器工具 express-generator 可以快速创建一个应用的骨架。你可以通过 npx (包含在Node.js8.2.0及更高版本中)命令来运行Express应用程序生成器。$npxexpress-generator对于较老的Node版本,请通过npm将Express应用程序生成器安......
  • ES6的新特性有哪些
    1、let和const声明变量的方式,取代了var关键字。2、箭头函数(ArrowFunction),简化了函数的书写方式。3、模板字符串(TemplateString),允许在字符串中使用变量和表达式,而不需要使用字符串连接符号4、解构赋值(DestructuringAssignment),允许从数组和对象中提取值并赋值给变量。......
  • IIncrementalGenerator 增量 Source Generator 生成代码入门 从语法到语义 获取类型完
    本文告诉大家如何在使用IIncrementalGenerator进行增量的SourceGenerator生成代码时,如何从语法分析过程,将获取的语法Token转换到语义分析上,比如获取类型完全限定名。一个使用的例子是在拿到一个Token表示某个类型时,本文将演示通过语义分析获取到拿到的Token的Type类......
  • es6 扩展运算符 三个点(...)
         参考:https://blog.csdn.net/qq_30100043/article/details/53391308   参考:https://blog.csdn.net/snackpdd/article/details/119388250......