zoukankan      html  css  js  c++  java
  • generator和promise配合解决js异步地狱问题

    为何要使用generator函数和promise?

    • js的异步地狱一直是困扰前端程序员的一个头疼的问题

    比如说我要获取还有列表,一般来说会使用ajax来获取

    $.ajax(...等等,function(res){
        // res代表获取的本人信息
        $.ajax(....等等,function(res){
            //在本人信息的基础之上获取我的好友名字
            $.ajax(....等等,function(res){
            //根据我的好友名字获取我的好友的基本信息等等...
                   
            })
        })
    })
    
    • 从上面的代码可以看出来,异步虽然是一个很好的方式,但是过多的嵌套会带来很严重的问题,并且性能不是很高

    第一版本解决方式

    • 使用promise和await/async配合
    function getTime(){
        return new Promise((resolve,reject){
            setTimeout(()=>{
                resolve('这是一秒之后')
            },1000)
        })
    }
    

    第二版本解决方式

    • 配合await/async使用
    async function test(){
        //在这里面就可以像同步代码一样书写异步函数
        //并且不会出现js异步地狱的问题
        const result = await getTime()
        return result;
    }
    test()  //开始执行
    
    • 使用then的方式
    getTime().then(res=>{
        console.log(res)   //会返回resovle的结果
    }).catch(error=>{
        console.log(error)   //打印错误的情况下
    })
    

    虽然说这个代码已经很实用,很好看了,但是如果有更好的方式可以解决多个异步函数的问题,让他循环执行,岂不是完美

    • 那么就看接下来的

    终极版

    function* add(num){
    	const r1 = yield getPromise(num)
    	yield getPromise(r1)
    }
    function getPromise(num){
    	return new Promise((resolve,reject)=>{
    		setTimeout(()=>{
    			var count = num * num
    			console.log(count)
    			resolve(count)
    		},1000)
    	})
    }
    var r2 = add(2);
    r2.next().value.then(res=>{
    	console.log(r2.next(res))
    })
    

    看的出来,没有减少代码甚至增加了代码量

    • 主要是由于generator本身并不是一个单独使用的函数,一般会配合很多库来使用

    如果用过redux-saga的人一定不会陌生了

    分享不易,希望可以留下小星星-

  • 相关阅读:
    java语言基础1问题汇总
    java从命令行接受多个数字求和输出
    关于Django迁移出现问题
    python中在ubuntu中安装虚拟环境及环境配置
    MVC与MVT
    前端性能优化
    less、sass、stylus
    bootstrap
    Swiper4.x使用方法
    swiper
  • 原文地址:https://www.cnblogs.com/sunhang32/p/11812823.html
Copyright © 2011-2022 走看看