zoukankan      html  css  js  c++  java
  • 对Promise的质疑

    Promise是为了解决多层回调函数嵌套结构太深,代码逻辑不符合线性流程的问题。线性流程问题是解决了的,但是嵌套结构太深(每多一层回调就多一层缩进)感觉并没有解决。

    在不提取函数的情况下,串行异步加载3张图片的传统代码如下:

    var img1 = new Image();
    img1.onload=function (){
        var img2 = new Image();
        img2.onload=function (){
            var img3 = new Image();
            img3.onload=function (){
                console.log("ended");
            };
            img3.src="http://img1.bdstatic.com/static/home/widget/search_box_home/logo/home_white_logo_0ddf152.png";
        };
        img2.src="http://www.baidu.com/img/bd_logo.png";
    };
    img1.src="http://www.baidu.com/img/bd_logo1.png";

    用Promise之后的代码如下:

    new Promise(function (resolve, reject) {
        var img1 = new Image();
        img1.onload=function (){
            resolve();
        };
        img1.src="http://www.baidu.com/img/bd_logo1.png";
    }).then(function (){
        new Promise(function (resolve, reject) {
            var img2 = new Image();
            img2.onload=function (){
                resolve();
            };
            img2.src="http://www.baidu.com/img/bd_logo.png";
        }).then(function (){
            new Promise(function (resolve, reject) {
                var img3 = new Image();
                img3.onload=function (){
                    resolve();
                };
                img3.src="http://img1.bdstatic.com/static/home/widget/search_box_home/logo/home_white_logo_0ddf152.png";
            }).then(function (){
                console.log("ended");
            });
        });
    });

    可以看到代码顺序是得到纠正了,但是加载第3张图片的代码仍然有3个缩进。
    如果还是用传统的方法,但是提取函数的话,也可以让代码的逻辑稍微调整得更易读些,缩进问题也解决了,代码如下:

    function step1(){
        var img1 = new Image();
        img1.onload=function (){
            step2();
        };
        img1.src="http://www.baidu.com/img/bd_logo1.png";
    }
    function step2(){
        var img2 = new Image();
        img2.onload=function (){
            step3();
        };
        img2.src="http://www.baidu.com/img/bd_logo.png";
    }
    function step3(){
        var img3 = new Image();
        img3.onload=function (){
            console.log("ended");
        };
        img3.src="http://img1.bdstatic.com/static/home/widget/search_box_home/logo/home_white_logo_0ddf152.png";
    }
    step1();

    刚接触Promise,对它了解不多,不知道是不是还有更好的写法。

  • 相关阅读:
    Java实现web页面内容抓取
    Java写入文件的几种方法及性能对比
    Java实现导出excel
    win10系统安装VMware虚拟机软件以及linux系统
    oracle11g安装教程
    oracle怎么建立本地连接
    工厂模式
    计算一个字符串中每个字符出现的次数
    MySql多表查询
    如何查看MySql的sql语句性能
  • 原文地址:https://www.cnblogs.com/omega8/p/5201847.html
Copyright © 2011-2022 走看看