jquery promise从入门到装逼

对于promise的实现远不止jquery一家,when.js,promise.js,async.js都对promise有不同程度的实现,实现思路可能大同小异,但是最初的目的只有一个,那就是拯救回调地狱,使得代码更加清晰可维护,这里,我们只挑选jquery的promise来进行装逼实验。这里不多说回调地狱的坑了,咱只说说promise的美妙。
首先来感受一下promise强大的气场

function doA(){
        var deferred = $.Deferred();
        if(完美结局){
            deferred.resolve(有啥给啥);
        }else{//一言不合
            deferred.reject(我不喜欢你);
        }
        return deferred.promise();
    }
 function doA1(){
        var deferred = $.Deferred();
        if(完美结局){
            deferred.resolve(有啥给啥);
        }else{//一言不合
            deferred.reject(我不喜欢你);
        }
        return deferred;
    }

如果您看着这上面这两段代码是一样的,那就先当成是一样的,无妨。咱继续往下给您分析分析
看doA函数的条件语句块,其实promise最重要的零件也就那几块东西了,这里就有两块了,resolve和reject,从上应该可以清晰的看出这两者是啥意思了,resolve就是说检验合格了,你可以继续往下生产了,而且我给你原料你带着,当参数传入下一个回调;相反的,reject就是说你没通过检验啊,可能得先一边呆着了,反正就是我拒绝你了。那么resolve或reject过后接下来干嘛呢,得继续往下走啊,那就看接下来干嘛。

function doB(resolve带下来的生产原料){
    //在A的基础上继续生产
}
function doBFail(拒绝你的理由啥的){
    //被拒绝后默默哭泣或者坚强活下去
}
doA().done(doB).fail(doBFail);

这里面,又涉及到了promise重要的几个东西,done,fail和then,doA()返回的是promise对象,promise对象有then,done和fail这几个函数,大家应该注意到promise的调用方式是链式调用,也就是说then,done函数也返回promise对象,其中,then函数常用的有两个参数,success和error函数,如上代码所示,deferred.resolve的时候执行success回调,reject的时候就是后者了。接下来再看看如果再B的基础上还要继续执行C应该怎么办。doB函数得再做一点事情,因为往下执行的动力是resolve,所以doB函数应该是这样

function doB(resolve带下来的生产原料){
    //在A的基础上继续生产
    var deferred = $.Deferred();
    if(需要继续往下执行C){
        deferred.resolve(继续往下带参数);
    }else{}
}
function doC(B resolve后带下来的生产原料){
    //在B的基础上继续生产
}
调用方式:doA().then(doB,doBFail).then(doC,...);

接下来回头看看我们的doA和doA1两个函数,是不是看出一点区别了,doA函数返回的是promise对象,doA1返回的是deferred对象,那么这两者有什么区别呢,前面提到过promise对象有then,done,fail这几个函数,这些东西deferred对象都有,而且deferred对象有promise对象没有的东西,不知道大家注意到没有,resolve和reject方法,是deferred独有的,promise是没有的,那么,这意味着什么呢。我们还是结合doA和doA1两个函数的差异解释一下,因为触发then,fail,done这些函数都是通过deferred的resolve和reject来的,假设定义一个变量a1=doA1(),返回的是deferred对象,那如果我在外部调用一下resolve方法,a1.resolve();会怎么样呢?这个答案就交给你了。如果还是不明白那就私信我吧,给你解释一下。
所以为了避免混乱,我们建议doA的方式,返回一个promise对象而非deferred对象。
这里遗憾没有用个实例讲解,下一篇,我尽量用一个实例来加强说明。
如果错误,望轻喷,我改。
谢谢大家。


个人简介:
前端小司机,倒腾前端一切,砸尽一切非前端的饭碗。
有兴趣请加前端交流群
这里写图片描述

猜你喜欢

转载自blog.csdn.net/jiangcs520/article/details/51864081