zoukankan      html  css  js  c++  java
  • js generator的两个实际应用

    generator作为一个用来操作异步的状态机, 遇到yield停止, 通过调用next()来继续操作。  今天就用generator来举例两个实际开发中的应用。

    1,抽奖

    function draw(count) {      //抽奖模拟
        setTimeout(function(count){
              console.log(`还剩余${count}次机会!`);
        }, 1000);
    }
    
    function generatorDraw(count) {        // 生成generator函数
        while(count > 0) {
            count --;
            yield draw(count);
        }
    }
    
    let beginDraw = generatorDraw(3);  // 这个3一般是从服务端获取   开始调用;
    
    const btn = document.createElement('button');
    btn.innerText = '抽奖';
    btn.addEventListener('click', function(){
          beginDraw.next();
    })
    document.body.addpendChild(btn);

    这样通过 每次点击按钮就调用一次next 来实现次数的递减,当然抽奖的逻辑每次都会执行, 当然你也可以在每次执行逻辑的时候, 让按钮禁止点击。这样就更加严谨一点。

    2,长轮询

     以前的长轮询都是通过定时器来不断的访问给定的接口。 鉴于现在的浏览器对websocket的支持已经很好了,所以大部分都可以直接使用websocket,  但可以通过这个来模拟一下使用generator的思路。

    function *ajax() {    // 模拟ajax请求
        yield new Promise((resolve, reject) => {
            setTimeout(function () {
                resolve({code :0});
            }, 200)
        })
    }
    
    
    function pull() {
        let generator = ajax();
        let step = generator.next();
        step.value.then( res => {
            if (res.code !== 0) {   // 通过获得的数据和前一次的想比较,如果相同就继续轮询,不同的话就输出
                setTimeout(function () {
                    console.log(`数据没有更新,继续轮询`);
                    pull();
                }, 1000)
            } else {
                console.log(res);
            }
        })
    }
    
    pull();
  • 相关阅读:
    ubuntu一般软件安装在什么目录
    Swing是一把刀
    eclipse 3.6的VE配置 Visual Editor for eclipse3.6
    有关import sun.audio.AudioPlayer(或者其它文件)的问题
    ubuntu 下安装jdk
    linux查看java jdk安装路径
    关于绿色
    Swing如何正确的处理界面中的线程(EDT)
    在Eclipse4.2x中安装最新版插件WindowBuilder
    Eclipse java swing开发环境
  • 原文地址:https://www.cnblogs.com/wjyz/p/11102379.html
Copyright © 2011-2022 走看看