实现一个函数,执行该函数后,每隔 1s 在控制台打印从 0 开始递增的数字,直到打印 10 停止

解法1

  1. function printIncrement() {
  2. const fn = function* () {
  3. for(let i = 0; i <= 10; i++) {
  4. yield i;
  5. }
  6. }
  7. const num = fn();
  8. const timer = setInterval(() => {
  9. // value属性就是当前yield表达式的值
  10. const value = num.next().value;
  11. if(value <= 10) {
  12. console.log(value);
  13. } else {
  14. clearInterval(timer);
  15. }
  16. }, 1000)
  17. }

解法2

  1. function printIncrement() {
  2. let num = 0;
  3. const fn = function* () {
  4. console.log(num);
  5. while(yield num++) {
  6. console.log(num);
  7. }
  8. }
  9. const counter = fn();
  10. const timer = setInterval(() => {
  11. if (num > 10) {
  12. clearInterval(timer);
  13. }
  14. // yield表达式本身没有返回值,或者说总是返回undefined。next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值
  15. counter.next(num <= 10);
  16. }, 1000)
  17. }

解法3

  1. async function printIncrement() {
  2. const fn = num => (
  3. new Promise((resolve) => {
  4. setTimeout(() => {
  5. resolve(num)
  6. }, 1000)
  7. })
  8. );
  9. let num = 0;
  10. while(num <= 10) {
  11. console.log(await fn(num++))
  12. }
  13. }