对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,对它了解不多,不知道是不是还有更好的写法。

时间: 2024-08-28 00:23:12

对Promise的质疑的相关文章

前端要给力之:红绿灯大战中的火星生命-Promise

目录 目录 传说的开始 看到winter的代码我的第一反应是全无promise的精髓 其实我了解Promise也是新近的事情 我与Promise后来发生的故事 红绿灯大战的亲历实录 Promise写出来怎么会是这个样子 欢迎回到火星 感谢米粽粽同学提到我的一篇旧文 第一步的抽象 一点说明前提 重新定义问题 Promise的编程基础之逻辑过程 如何确认一个数据就绪 然后then只能处理一个数据 最后任何情况下then总是立即返回一个promise 解决问题的方法 得到一些基础件 如何在Promis

PROMISE公司CEO李志恩:云计算要看长期投资回报

人们只有在经历了数据丢失的惨痛教训后,才会感到数据备份的重要性和必要性.云计算也一样,只有到了一个时间临界点,用户的需求才会被真正激发出来,云应用才会得到快速普及. 在今年的台北电脑展上,记者见到了老朋友--存储厂商PROMISE公司首席执行官李志恩.在交谈中,李志恩谈及公司的云计算业务做得风声水起.最早从IC设计起家,后来专注于存储系统的开发和销售,现在又积极地向云计算转型,PROMISE一直在追随潮流,既是挑战市场,也是挑战自己."每个产品都有其生命周期.我们每五年就会变一次脸.我们现在关注

promise方法

promise TemplateService.uploadTempate(fieKey).then(function(result){sef.memKay = result.data},function(error){console.log(error)}) 只要有then,它就是一个promise. TemplateService.uploadTempate(fieKey)返回一个promise,承诺如果TemplateService.uploadTempate(fieKey)函数执行成功,

Promise 原理探究及其简单实现

可移步 http://donglegend.com/2016/09/11/promise%E5%8E%9F%E7%90%86%E6%8E%A2%E7%A9%B6/ 观看 Promise是个什么玩意,大家都知道,度娘告诉我,以同步方式书写异步,解决回调地狱... 状态机 早闻Promise的大名,简单介绍,根据状态改变来执行相应处理函数.Promise的状态极其简单,只有 “pending”, “resolved”, “rejected”三种状态然后就是如何实现的问题,最关键的当然是监听到状态的更

【Mocha.js 101】同步、异步与 Promise

前情提要 在上一篇文章<[Mocha.js 101]Mocha 入门指南>中,我们提到了如何用 Mocha.js 进行前端自动化测试,并做了几个简单的例子来体验 Mocha.js 给我们带来的便利. 在本篇文章中,我们将了解到 Mocha.js 的同步/异步测试,以及如何测试 Promise. 同步代码测试 在上一篇文章中,其实我们已经学会了如何测试同步代码.今天,我们 BDD 风格编写一个测试: var should = require( 'should' ); var Calculator

Promise实现多图预加载

Promise正如它的中文意思"承诺"一样,保存着未来会发生事件(一般为异步操作).Promise避免了"回调地狱",写法更加接近同步操作.说到同步,我更加喜欢async.await,它们书写更贴近同步操作. 图片加载往往是异步的,如果有操作需要等到所有的图片加载完之后再执行,这时候就需要不断的监听所有图片的加载情况. ES5 利用ES5实现多图预加载,可以通过计数器判断有多少图片加载完成. var count = 0, // 计数器 imgs = []; /* *

摘抄 Promise原理

1.简单的promise: //极简promise雏形 function Promise(fn){ var value = null; callbacks = [];//callback为数组,因为可以同时有很多个回调 this.then = function(onFulfilled){ callbacks.push(onFulfilled); } function resolve(value){ callbacks.forEach(function(callback){ callback(va

从源码看 Promise 概念与实现

Promise 是 JS 异步编程中的重要概念,它较好地解决了异步任务中回调嵌套的问题.在没有引入新的语言机制的前提下,这是如何实现的呢?上手 Promise 时常见若干晦涩的 API 与概念,它们又为什么存在呢?源码里隐藏着这些问题的答案. 下文会在介绍 Promise 概念的基础上,以一步步代码实现 Promise 的方式,解析 Promise 的实现机制.相应代码参考来自 PromiseJS 博客 及 You don't know JS 的若干章节. Why Promise (有使用 Pr

从C#到TypeScript - Promise

从C#到TypeScript - Promise 背景 相信之前用过JavaScript的朋友都碰到过异步回调地狱(callback hell),N多个回调的嵌套不仅让代码读起来十分困难,维护起来也很不方便.其实C#在Task出现之前也是有类似场景的,Async Programming Mode时代,用Action和Func做回调也很流行,不过也是意识到太多的回调嵌套代码可读性差且维护不易,微软引入了Task和Task-based Async Pattern.虽然不知道是哪个语言最早有这个概念,