基本概念

Generators 是可以用来控制迭代器的函数

语法/使用

  1. {
  2. // genertaor基本定义
  3. let tell = function* () {
  4. yield "a";
  5. yield "b";
  6. return "c";
  7. };
  8. let k = tell();
  9. console.log(k.next()); // { value: 'a', done: false }
  10. console.log(k.next()); // { value: 'b', done: false }
  11. console.log(k.next()); // { value: 'c', done: true }
  12. console.log(k.next()); // { value: undefined, done: true }
  13. }
  • 函数内部用 yield 来控制程序的执行的 “暂停”,并返回一个对象,这个对象包括两个属性:value 和 done
  • 函数的返回值通过调用 next 来 “恢复” 程序执行
  • Generator 函数的定义不能使用箭头函数,否则会触发 SyntaxError 错误

generator(生成器)是 ES6 标准引入的新的数据类型。一个 generator 看上去像一个函数,但可以返回多次。

  1. {
  2. let obj = {};
  3. obj[Symbol.iterator] = function* () {
  4. yield 1;
  5. yield 2;
  6. yield 3;
  7. };
  8. for (let value of obj) {
  9. console.log("value", value);
  10. }
  11. // value 1
  12. // value 2
  13. // value 3
  14. }
  15. {
  16. let state = function* () {
  17. while (1) {
  18. yield "A";
  19. yield "B";
  20. yield "C";
  21. }
  22. };
  23. let status = state();
  24. console.log(status.next()); // { value: 'A', done: false }
  25. console.log(status.next()); // { value: 'B', done: false }
  26. console.log(status.next()); // { value: 'C', done: false }
  27. console.log(status.next()); // { value: 'A', done: false }
  28. console.log(status.next()); // { value: 'B', done: false }
  29. }
  30. // {
  31. // let state = async function () {
  32. // while (1) {
  33. // await "A";
  34. // await "B";
  35. // await "C";
  36. // }
  37. // };
  38. // let status = state();
  39. // console.log(status.next());
  40. // console.log(status.next());
  41. // console.log(status.next());
  42. // console.log(status.next());
  43. // console.log(status.next());
  44. // }
  45. {
  46. let draw = function (count) {
  47. //具体抽奖逻辑
  48. console.info(`剩余${count}次`);
  49. };
  50. let residue = function* (count) {
  51. while (count > 0) {
  52. count--;
  53. yield draw(count);
  54. }
  55. };
  56. let star = residue(5);
  57. let btn = document.createElement("button");
  58. btn.id = "start";
  59. btn.textContent = "抽奖";
  60. document.body.appendChild(btn);
  61. document.getElementById("start").addEventListener(
  62. "click",
  63. function () {
  64. star.next();
  65. },
  66. false
  67. );
  68. }
  69. {
  70. // 长轮询
  71. let ajax = function* () {
  72. yield new Promise(function (resolve, reject) {
  73. setTimeout(function () {
  74. resolve({
  75. code: 0,
  76. });
  77. }, 200);
  78. });
  79. };
  80. let pull = function () {
  81. let genertaor = ajax();
  82. let step = genertaor.next();
  83. step.value.then(function (d) {
  84. if (d.code != 0) {
  85. setTimeout(function () {
  86. console.info("wait");
  87. pull();
  88. }, 1000);
  89. } else {
  90. console.info(d); // { code: 0 }
  91. }
  92. });
  93. };
  94. pull();
  95. }