首页 > 其他分享 >生成器函数

生成器函数

时间:2022-12-06 22:45:47浏览次数:35  
标签:console 函数 iterator 生成器 yield next log

一、生成器函数声明与调用

  生成器就是一个特殊的函数,用于异步编程。

  常见的异步操作:文件操作、网络操作(ajax,request)、数据库操作等。

  我们之前对异步编程使用的是纯回调函数。生成器就是对异步编程的一种解决方案。

  1.声明方式

function * fn(){
    console.log("Hello generator");
}

  2.执行方式

let iterator = fn();
//必须调用next()方法才能执行
iterator.next();

  在生成器函数中可以执行yield语句;

  yield关键词函数代码的分隔符,将一个函数代码分成几段,一段段的执行,可以让生成器停止和开始执行。

function * fn(){
    console.log(111);
    yield'一直没有耳朵';//一段
    
    console.log(222);
    yield'一直没有尾巴';//一段
    
    console.log(333);
    yield'真奇怪';//一段
    
    console.log(444);
}//一段

二、生成器函数参数传递

function * fn(arg){
    console.log(arg);
    let one = yield 111;
    console.log(one);
    yield 111;
    yield 222;
    yield 333;
}

let iterator = fn('AAA');
//next方法可以传入实参
console.log(iterator.next());//value:111,done:false
//next传入的实参将作为上一个yield语句的返回结果
console.log(iterator.next('BBB'));

三、生成器函数实例

  异步编程

  1.要求:1s后控制台输出111,2s后输出222,3s后输出333;

//使用定时器操作(回调地狱)
setTiemout(() =>{
    console.log(111);
    setTiemout(() =>{
        console.log(222);
        setTiemout(() =>{
            console.log(333);
        },3000)
    },2000)
},1000)

  使用生成器函数来实现:

//使用生成器函数
function one(){
    setTimeout(()=>{
        console.log(111);
        iterator.next();//让它能够继续走下去
    },1000)
}

function two(){
    setTimeout(()=>{
        console.log(222);
        iterator.next();
    },2000)
}

function three(){
    setTimeout(()=>{
        console.log(333);
        iterator.next();
    },3000)
}

function * gen(){
    yield one();
    yield two();
    yield three();
}

//调用生成器函数
let iterator = gen();
iterator.next();

  2.模拟获取用户数据、订单数据、商品数据;

function getUsers(){
    setTimeout(()=>{
        let data = '用户数据';
        //调用next方法,并将数据传入
        iterator.next(data);
    },1000)
}

function getOrders(){
    setTimeout(()=>{
        let data = '订单数据';
        iterator.next(data);
    },1000)
}

function getGoods(){
    setTimeout(()=>{
        console.log('商品数据');
        iterator.next(data);
    },1000)
}

function * gen(){
    let users = yield getUsers();
    console.log(users);
    let orders = yield getOrders();
    console.log(orders);
    let goods = yield getGoods();
    console.log(goods);
}

//调用生成器函数
let iterator = gen();
iterator.next();

 

标签:console,函数,iterator,生成器,yield,next,log
From: https://www.cnblogs.com/chuzhi/p/16961648.html

相关文章

  • MySQL 快速入门之DATE_FORMAT() 函数详解
    一:定义和用法DATE_FORMAT()函数用于以不同的格式显示日期/时间数据。语法DATE_FORMAT(date,format)date参数是合法的日期。format规定日期/时间的输出格式。可以......
  • 导数专题 函数零点个数
    \({\color{Red}{欢迎到学科网下载资料学习}}\)[【基础过关系列】高二数学同步精品讲义与分层练习(人教A版2019)](https://www.zxxk.com/docpack/2875423.html)\({\col......
  • 5.3.2(3) 导数在函数中的应用
    \({\color{Red}{欢迎到学科网下载资料学习}}\)[【基础过关系列】高二数学同步精品讲义与分层练习(人教A版2019)](https://www.zxxk.com/docpack/2875423.html)\({\col......
  • Mybatiplus通用3.5.1版本及其以上的代码生成器工具类
    Mybatiplus通用3.5.1版本及其以上的代码生成器工具类packagecom.gton.util;importcom.baomidou.mybatisplus.annotation.FieldFill;importcom.baomidou.mybatisplus......
  • CPP 如何将一个函数泛型化 How to Make a Function Generic
    1. Developinggenericfunction(设计泛型函数) 1.1.Steps(步骤) (1)    Tostartwithnon-genericfunction (先设计/编写一个非泛型函数)(2)   ......
  • 5.3.2(1) 导数与函数的极值
    \({\color{Red}{欢迎到学科网下载资料学习}}\)[【基础过关系列】高二数学同步精品讲义与分层练习(人教A版2019)](https://www.zxxk.com/docpack/2875423.html)\({\col......
  • 【Azure 应用服务】Azure Function Timer触发函数加上Singleton后的问题
    问题描述在AzureFunctionTimerTrigger的函数中,添加了Singleton属性,当Function的实例变为3个后,发现Timer函数并没有在三个实例上同时运行,每次触发时,都只有在一个实例上......
  • 5.3.2(2) 导数与函数的最值
    \({\color{Red}{欢迎到学科网下载资料学习}}\)[【基础过关系列】高二数学同步精品讲义与分层练习(人教A版2019)](https://www.zxxk.com/docpack/2875423.html)\({\col......
  • 5.3.1 (2) 函数的单调性(含参函数)
    \({\color{Red}{欢迎到学科网下载资料学习}}\)[【基础过关系列】高二数学同步精品讲义与分层练习(人教A版2019)](https://www.zxxk.com/docpack/2875423.html)\({\col......
  • 5.3.1 (1) 函数的单调性
    \({\color{Red}{欢迎到学科网下载资料学习}}\)[【基础过关系列】高二数学同步精品讲义与分层练习(人教A版2019)](https://www.zxxk.com/docpack/2875423.html)\({\col......