1. // generator函数 可以通过yield关键字,将函数挂起,为了改变执行流提供了可能,同时为了做异步编程提供了方案
    2. // 它普通函数的区别
    3. // 1.function后面 函数名之前有个*
    4. // 2.只能在函数内部使用yield表达式,让函数挂起
    5. /* function* func() {
    6. console.log('one');
    7. yield 2;
    8. console.log('two');
    9. yield 3;
    10. console.log('end');
    11. }
    12. // 返回一个遍历器对象 可以调用next()
    13. let fn = func();
    14. // console.log(o)
    15. console.log(fn.next());
    16. console.log(fn.next());
    17. console.log(fn.next()); */
    18. // 总结:generator函数是分段执行的,yield语句是暂停执行 而next()恢复执行
    19. function* add() {
    20. console.log('start');
    21. // x 可真的不是yield '2'的返回值,它是next()调用 恢复当前yield()执行传入的实参
    22. let x = yield '2';
    23. console.log('one:'+x);
    24. let y = yield '3';
    25. console.log('two:'+y);
    26. return x+y;
    27. }
    28. const fn = add();
    29. console.log(fn.next()); //{value:'2',done:false}
    30. console.log(fn.next(20)); //{value:'3',done:false}
    31. console.log(fn.next(30)); //{value:50,done:true}
    32. // 使用场景1:为不具备Interator接口的对象提供了遍历操作
    33. function* objectEntries(obj) {
    34. // 获取对象的所有的key保存到数组 [name,age]
    35. const propKeys = Object.keys(obj);
    36. for(const propkey of propKeys){
    37. yield [propkey,obj[propkey]]
    38. }
    39. }
    40. const obj = {
    41. name:'mufeng',
    42. age:18
    43. }
    44. obj[Symbol.iterator] = objectEntries;
    45. console.log(obj);
    46. for(let [key,value] of objectEntries(obj)){
    47. console.log(`${key}:${value}`);
    48. }

    用于异步(了解)

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
    7. <title>11 Generator的应用</title>
    8. <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
    9. </head>
    10. <body>
    11. <script>
    12. // Generator 部署ajax操作,让异步代码同步化
    13. // 回调地狱
    14. /* $.ajax({
    15. url: 'https://free-api.heweather.net/s6/weather/now?location=beijing&key=4693ff5ea653469f8bb0c29638035976',
    16. method: 'get',
    17. success(res) {
    18. console.log(res);
    19. // 继续发送请求
    20. $.ajax({
    21. url: '',
    22. method: 'get',
    23. success(res1) {
    24. // 发送ajax
    25. $.ajax({
    26. url: '',
    27. method: 'get',
    28. success(res2) {
    29. // 发送ajax
    30. $
    31. }
    32. })
    33. }
    34. })
    35. }
    36. }) */
    37. /* function* main() {
    38. console.log('main');
    39. let res = yield request(
    40. 'https://free-api.heweather.net/s6/weather/now?location=beijing&key=4693ff5ea653469f8bb0c29638035976'
    41. )
    42. console.log(res);
    43. // 执行后面的操作
    44. console.log('数据请求完成,可以继续操作');
    45. }
    46. const ite = main();
    47. ite.next();
    48. function request(url) {
    49. $.ajax({
    50. url,
    51. method: 'get',
    52. success(res) {
    53. ite.next(res);
    54. }
    55. })
    56. } */
    57. // 加载loading...页面
    58. // 数据加载完成...(异步操作)
    59. // loading关闭掉
    60. function* load() {
    61. loadUI();
    62. yield showData();
    63. hideUI();
    64. }
    65. let itLoad = load();
    66. itLoad.next();
    67. function loadUI() {
    68. console.log('加载loading...页面');
    69. }
    70. function showData() {
    71. // 模拟异步操作
    72. setTimeout(() => {
    73. console.log('数据加载完成');
    74. itLoad.next();
    75. }, 1000);
    76. }
    77. function hideUI() {
    78. console.log('隐藏loading...页面');
    79. }
    80. </script>
    81. </body>
    82. </html>