es6 function* 函数生成器

主要介绍function* 函数生成器的作用及其使用

直接复制粘贴代码即可使用:

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8" />

<title>Document</title>

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>

</head>

<body>

 

</body>

<script>

 

//   1、函数生成器特点是函数名前面有一个‘*’

 

//   2、通过调用函数生成一个控制器

 

//   3、调用next()方法开始执行函数

 

//   4、遇到yield函数将暂停

 

//   5、再次调用next()继续执行函数

 

// function* fn() {

// console.log(1);

// //暂停!

// yield;

// //调用next方法继续执行

// console.log(2);

// }

// var iter = fn();

// iter.next(); //1

// iter.next(); //2

 

// --------------------------------------------

 

// function* fn() {

// var a = yield 'hello';

// yield;

// console.log(a);

// }

 

// var iter = fn();

// var res = iter.next();

// console.log(res.value); //hello

// iter.next(2);

// iter.next(); //2

 

// 可以看到,yield后面有一个字符串,在第一次调用next时,暂停在这里且返回给了iter.next()。

//   而暂停的地方是一个赋值语句,需要一个变量给a,于是next()方法中传了一个参数2替换了yield,最后打印a得到了2。

 

// -------------------------------------------------------------

 

// function fn(a, b) {

// //假设这是一个ajax请求

// ajax('url' + a + b, function(data) {

// //数据请求到会执行it.next

// it.next(data);

// });

// }

// //这里是函数生成器

// function* g() {

// //当异步操作完毕yield会得到值

// //这里会自动继续执行

// var text = yield fn(a, b);

// console.log(text);

// }

// var it = g();

// it.next();

 

// ------------------------------------------------------------


 

// 等待promise决议值返回

// function* fn(x) {

// var text = yield foo(1);

// yield foo(x);

// function foo(x) {

// return new Promise(function(resolve, reject) {

// //ajax异步请求完成会调用resolve决议

// // ajax(url, resolve);

// var url = 'url:' + x

// setTimeout(() => {

// resolve(url+'1231412412')

// }, 2000);

// });

// }

// }

 

// var it = fn();

// //返回一个promise

// var p = it.next().value;

// //对promise处理

// p.then(function(text) {

// //这里继续执行生成器

// let val = it.next(text).value;

 

// // console.log(text)

// // console.log(val)

// })

 

function run(gen) {

//获取除了生成器本身以外的参数

var args = [].slice.call(arguments, 1),

it;

it = gen.apply(this, args);//调用生成器 类似上面 var it = fn();

 

// Promise.resolve('foo');等价于

// new Promise(resolve => resolve('foo'));

 

return Promise.resolve().then(function handleNext(value) {

//第一次启动无value

var next = it.next(value);

return (function handleResult(next) {

//执行完毕返回

 

if (next.done) {

return next.value;

} else {

//如果还有就决议next.value传给handleNex

return Promise.resolve(next.value).then(handleNext, (err)=> { console.log(err) });

}

})(next);

});

}

//这是一个函数生成器

function* main() {

 

//这种方式可以在获取到前两个异步请求后

//再次根据前两个请求结果获取第三个请求

 

let ur1 = '请求ur1';

let ur2 = '请求ur2';

let ur3 = '请求ur3';

 

let r1 = yield requst(ur1);

let r2 = yield requst(ur2);

let r3 = yield requst(ur3+r1+r2);

 

console.log(r3);

// 模拟异步请求

function requst(x) {

return new Promise(function(resolve, reject) {

//ajax异步请求完成会调用resolve决议

// ajax(url, resolve);

var url = 'url:' + x

setTimeout(() => {

resolve(url)

}, 2000);

});

}

};

//该调用会自动异步运行直到结束

run(main);

</script>

</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
S-Function 可以使用MATLAB®,C,C ,Ada,或Fortran 语言来编写。使用MEX 实用工具,将C,C ,Ada,和Fortran 语言的S-Function 编译成MEX-文件,在需要的时候,它们可与其它的MEX-文件一起动态地连接到MATLAB 中。 S-Function 使用一种特殊的调用格式让你可以与Simulink 方程求解器相互作用,这与发生在求解器和内置Simulink 块之间的相互作用非常相似。S-Function 的形式是非常通用的,且适用于连续、离散和混合系统。 S-function 为你提供了一种在Simulink 模型中增加自制块的手段,你可以使用MATLAB,C,C ,Ada,或Fortran 语言来创建自己的块。按照下面一套简单的规则,你可以在S-function 中实现自己的算法。在你编写一个S-Functin 函数,并将函数名放置在一个S-Functin 块中(在用户定义的函数块库中有效)之后,通过使用masking 定制用户界面。 目录 S-FUNCTION 概述.......... 1 什么是 S-FUNCTION...... 2 在模型中使用S-FUNCTION...... 3 向 S-Function 传递参数....... 3 何时使用 S-Function 4 S-FUNCTION 的工作原理.......... 5 Simulink 块的数学关系........ 5 仿真过程......... 5 S-Function 回调程序. 6 S-FUNCTION 的实现...... 8 M-文件的S-Function.......... 8 MEX 文件的S-function ....... 8 MEX 文件与M-文件的S-function 比较... 9 S-FUNCTION 的概念..... 10 直接馈通....... 10 动态维矩阵... 10 设置采样时间和偏移量.......11 S-FUNCTION 范例........ 14 M 文件S-function 范例...... 15 C S-Function 范例... 16 Fortran S-Function 范例.... 18 C S-Function 范例......... 18 Ada S-Function 范例......... 18 编写 M S-FUNCTION.... 19 概述........ 20 S-Function 参数...... 20 S-Function 的输出... 20 定义 S-FUNCTION 块特性....... 22 处理 S-FUNCTION 参数 22 M 文件的S-FUNCTION 范例... 23 范例 1——简单的M 文件S-Function ... 23 范例 2——连续状态S-Function . 25 范例 3——离散状态S-Function . 27 范例 4——混合系统S-Function . 28 范例 5——变步长S-Function ..... 31 ii 使用C 语言编写S-FUNCTION .......... 33 概述........ 34 创建 C MEX S-Function.... 35 自动生成 S-FUNCTION 36 配置生成的 S-Function...... 37 S-Function Builder 如何生成S-Function......... 37 设置 include 路径.... 37 S-FUNCTION BUILDER 的对话窗........ 39 Initialization 选卡..... 39 Data Properties 选卡......... 40 Libraries 选卡.......... 42 Outputs 选卡 43 Continuous Derivatives 选卡....... 45 Discrete Update 选卡........ 46 Build Info 选卡........ 47 一个基本的 C MEX S-FUNCTION 范例....... 48 定义与包含... 49 回调函数的实现...... 50 Simulink/Real-Time Workshop 接口..... 51 Building Timestwo 范例..... 51 C S-FUNCTION 模板..... 52 S-Function 源文件必需的内容..... 52 SimStruct...... 53 编译 C S-Function.. 53 SIMULINK 如何与C S-FUNCTION 相互作用 54 进程层面....... 54 数据层面....... 56 编写回调函数... 59 将 LEVEL 1 C MEX S-FUNCTION 转换到LEVEL 2 . 60 创建 C S-FUNCTION 63 创建 ADA S-FUNCTION.......... 64 创建 FORTRAN S-FUNCTION 65 实现块特性 67 对话框参数....... 68 iii 可调参数....... 68 运行参数 70 创建运行参数.......... 70 更新运行参数.......... 71 创建输入和输出端口... 72 创建输入端口.......... 72 创建输出端口.......... 73 输入的标量扩展...... 74 掩码多端口 S-Function...... 75 自定义数据类型.......... 76 采样时间 77 基于块的采样时间... 77 指定基于端口的采样时间.. 79 基于块与基于端口的混合采样时间 ........ 81 多速率 S-Function 块......... 82 多速率 S-Function 块的同步........ 83 工作向量 84 工作向量与过零检测.......... 85 包括指针工作向量的范例.. 85 内存分配....... 86 FUNCTION-CALL 子系统.......... 87 错误处理 89 防超程代码... 89 SsSetErrorStatus 的终止条件..... 90 数组边界检查.......... 90 S-FUNCTION 范例........ 91 连续状态的 S-Function 范例........ 92 离散状态的 S-Function 范例........ 93 混合系统的S-Function 范例........ 93 变步长的 S-Function 范例. 94 过零检测的 S-Function 范例........ 94 时变连续传递函数的 S-Function 范例... 94

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值