理解 ES6 Generator-next()方法

  1 <!DOCTYPE html>
  2 <html lang="en">
  3 <head>
  4     <meta charset="UTF-8">
  5     <title>generator-next</title>
  6 </head>
  7 <body>
  8
  9     <h3>理解 ES6 Generator-next() 方法</h3>
 10
 11     <script>
 12         window.onload = function() {
 13             // Generator 异步任务封装
 14
 15             // 例-1
 16             function* gene() {
 17                 // mark_1
 18                 let url = ‘https://api.github.com/‘;
 19                 let result = yield myAjax(url, ‘get‘, null, successCallBack, failCallBack);
 20                 // mark_2
 21                 let jsRelt = JSON.parse(result);
 22                 console.log(‘调用第二个 next 后, result 才等于 data: ‘, jsRelt[‘current_user_url‘]);
 23                 yield ‘end‘;
 24                 // mark_3
 25             }
 26
 27             let gn = gene(); // 返回一个遍历器对象 gn
 28             let first_next = gn.next(); // 调用第一个 next 方法: 启动遍历器, 执行 mark_1 ~ mark_2 之间的代码
 29             console.log(‘调用第一个 next 后: ‘, first_next); // 因为异步, first-next: {value: undefined, done: false}
 30
 31             // ajax 成功的回调函数
 32             function successCallBack(data) {
 33                 console.log(‘request-successful: !‘/*, data*/);
 34                 // * relt = gn.next(data) 说明:
 35                 // * 1. 此处调用第二个 next 方法: 执行 mark_2 ~ mark_3 之间的代码, 返回的对象 relt = {value: "end", done: false}
 36                 // * 2. yield ‘end‘; 是同步操作, 所以调用第二个 next 方法后 relt.value马上等于 yield 后面表达式的结果("end"),
 37                 // *     不信注释掉第三个 gn.next() 看结果),
 38                 // *     如果 yield 后面跟的是异步操作, 则需调用下一个 next 方法 relt.value 才有值.
 39                 let relt = gn.next(data);
 40
 41                 console.log(‘同步操作, relt 立马有值: ‘, relt);
 42
 43                 // 已经遍历完所有的 yield 语句, 无论再调用多少个 next() 方法都返回 {value: undefined, done: true}
 44                 console.log(‘调用第三个 next 返回的对象: ‘, gn.next() /*第三个next()方法*/);
 45             }
 46             // ajax 失败的回调函数
 47             function failCallBack(err) {
 48                 console.log(‘request-failed: ‘, err);
 49             }
 50
 51             /*
 52                 // 例-2
 53                 var fetch = require(‘node-fetch‘);
 54                 function* gen() {
 55                     var url = ‘https://api.github.com/users/github‘;
 56                     var result = yield fetch(url);
 57                     console.log(result.bio);
 58                 }
 59                 // 执行这段代码的方法如下:
 60                 var g = gen();
 61                 var result = g.next();
 62                 result.value.then(function(data) {
 63                     return data.json();
 64                 }).then(function(data) {
 65                     g.next(data);
 66                 });
 67             */
 68
 69             /*
 70             * Generator-next() 总说明:
 71             * 1.
 72             *     1.1 next(param) 方法的参数 param 表示上一条含 yield 关键字的语句的返回值
 73                     (即: 本条含有 yield 关键字的整条语句(可能还含有其他变量或表达式)的最终返回值为下一个 next() 中的参数), 所以例1 中: result = data;
 74                 1.2 或者说: 一条含有 yield 关键字的表达式语句(如例-1: let result = yield myAjax(url, ‘get‘, null, successCallBack, failCallBack);),
 75                     最终的值(result), 等于下一个next(data) 方法中的参数 data;
 76             * 2. 注意, gn.next() 返回的是一个对象, 其中的 value 属性的值等于其刚执行完的含 yield 关键字的语句 yield 后面的表达式的结果,
 77                  如果这个表达式是同步操作, 那返回的对象中 value 立马有值, 如果是异步操作, 则 value 首先是 undefined, 异步执行完后才有值.
 78             * 3. 执行的代码顺序: 调用第一个 next() 执行 mark_1 ~ mark_2 之间的代码,
 79                  第二个 next() 执行的是 mark_2 ~ mark_3 之间的代码, 以此类推;
 80             * 4. 例-2 作为参考, 摘自《ES6 标准入门(第3版)》阮一峰 著 第 360 页内容.
 81             *
 82             */
 83
 84
 85         }
 86
 87         // ------------ function -------------
 88
 89
 90         // 自定义 ajax, 类型仅限于 get 和 post, 回调函数: success/error
 91         function myAjax(url, type, params, success, error) {
 92             var xhr = null;
 93             var args = null;
 94             xhr = new XMLHttpRequest();
 95             xhr.onreadystatechange = function() {
 96                 if (xhr.readyState == 4) {
 97                     if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304) {
 98                         success(xhr.responseText);
 99                     } else {
100                         error("Request was unsuccessful: "+ xhr.status);
101                     }
102                 }
103             };
104             xhr.open(type, url, true); // 类型, 连接, 是否异步
105             if (type.toLowerCase() == ‘post‘) {
106                 // xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); // 默认的表单提交
107                 xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8"); // JSON.stringify 处理后的json 键值对
108                 args = params;
109             }
110             xhr.send(args);
111         }
112
113     </script>
114
115
116 </body>
117 </html>

原文地址:https://www.cnblogs.com/Rainscoco/p/9082331.html

时间: 2024-12-07 07:56:12

理解 ES6 Generator-next()方法的相关文章

es6 generator 函数中的yield理解

es6 generator 的yield理解 原文地址:https://www.cnblogs.com/malong1992/p/12129561.html

理解ES6的模块(Understanding ES6 Modules)

理解ES6的Modules 原文出处: Understanding ES6 Modules. 基础(Basic) 在ES6中,每个模块的都是定义在它自己的文件中.在模块中定义的变量或者是函数在外部都是不可见的, 除非你显示的使用export来导出它们. 这意味着你可以在你的模块中编写代码, 然后只导出那些需要被其他部分可以访问的部分几个. ES6模块是使用原生的定义方式进行定义的. 如果想从一个模块中导出某个变量, 只需要使用关键词export. 相似的, 如果想要使用来自另外一个模块中的变量,

es6的map()方法解释

es6的map()方法解释 map方法的作用不难理解,即“映射”,也就是原数组被“映射”成对应新数组.下面这个例子是数值项求平方: var data = [1, 2, 3, 4]; var arrayOfSquares = data.map(function (item) { return item * item; }); alert(arrayOfSquares); // 1, 4, 9, 16 callback需要有return值,如果没有,就像下面这样: var data = [1, 2,

理解toString()和hashCode()方法的重写

一般toString()方法会应用在自己bean类中.根据需要 在重写的toString 方法中 组织自己想要显示的当前对象的信息. 比如按一定规则格式返回 所以属性的名称及值. 当你要读取关于对象的一些有用细节时,可以在对象上调用toString(). 如,当把一个对象引用传递给System.out.println();时,该对象的toString()方法被调用. Java中所有的类都继承自Object父类,所以,我们在类中只要重写一下toString()方法就可以显示出我们想要的信息了. 看

看es6 字符串新方法有感

'x'.repeat(3) // "xxx" 'hello'.repeat(2) // "hellohello" 'na'.repeat(0) // "" 'x'.padStart(5, 'ab') // 'ababx''x'.padStart(4, 'ab') // 'abax'   上面是es6的新方法 es5 prototype可以写出 无聊写了点 String.prototype.repead=function(n){ var arr=n

理解jquery的.on()方法

jquery在的.on()方法用来给元素绑定事件处理函数的,我经常用在两个地方: 给未来的元素绑定事件:我总是这样用:$(document).on('click','#div1',function(){}); 给拥有同一个父元素的多个子元素绑定事件. 可以查看以前写的博客:jQuery中对未来的元素绑定事件 先来看一个实例: 在页面A的一个div里动态加载页面B,页面B里的一个div绑定了一个单击事件. 页面A如下: <body> <input type="button&quo

es6 javascript对象方法Object.assign()

es6 javascript对象方法Object.assign() 2016年12月01日 16:42:34 阅读数:38583 1  基本用法 Object.assign方法用于对象的合并,将源对象( source )的所有可枚举属性,复制到目标对象( target ). [javascript] view plain copy var target = { a: 1 }; var source1 = { b: 2 }; var source2 = { c: 3 }; Object.assig

JavaScript ES6 数组新方法 学习随笔

JavaScript ES6 数组新方法 学习随笔 新建数组 var arr = [1, 2, 2, 3, 4] includes 方法 includes 查找数组有无该参数 有返回true var includes = arr.includes(2) map方法 map 遍历处理返回新数组 原数组不会改变 var map = arr.map(function (item) { return ++item }) reduce方法 reduce 遍历处理数组返回结果 prev与next中间的符号以

es6数组的方法

1.复习的函数 函数是由关键字function声明的,他是一个引用数据类型,是Function的实例,在调用的时候会开辟一个私有空间 2.函数的成员 arguments:null  (是实参构成的数组集合) caller:null(是这个函数的调用者,函数在A个函数内调用,那么A就是这个函数的调用者,在window下caller是null) 案例: function fn(){ console.log(fn.caller) } function f(){ fn(23,56) } f()