zoukankan      html  css  js  c++  java
  • Javascript

    最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下。
     
    一:Promise是什么?为什么会有这个东西?
    首先说明,Promise是为了解决javascript异步编程时候代码书写的方式产生的。
    随着javascript的发展,异步的场景越来越多。前端有AJAX,setTimeout等,后端Node异步更多。按照传统的做法,那么就是各种回调嵌回调。代码可以把人绕晕。
    这个时候,CommonJS社区提出了一个叫做Promise/A+的规范,这个规范定义了如何书写异步代码,包括使用when/then/resolve等来组织异步的代码。
    这个规范由于很优雅,所以相继就有很多人实现了这个规范,其中包括 浏览器原生支持的Promise(), jQuery里面的deferred,when.js等。
    因为这几个库都符合该规范,所以学习一个也就可以了。我主要学习了jQuery的deferred,所以本文主要讲讲这个实现。
     
    二:jQuery的deferred
    首先,关于deferred对象,阮一峰老师有篇文章写的很详细了,地址点这。建议可以先看看他的那篇文章,再继续往下看。
    上面说过,promise是为了解决异步(比如ajax)的,那么我们来对比下他们的区别。
    经典的jQuery的AJAX的写法是
    $.ajax({
        type: "get",
        url: "",
        success: function () {},
        error; function () {}
    });
    其中success和error参数便是成功/失败时候的回调函数。
     
    而现在jQuery的AJAX写法成了
    $.ajax({
        type; "get",
        url: ""
    }).done(function () {}).fail(function () {});
    其中成功后会调用done里面的函数,失败便会调用fail里面的函数。
     
    看到这里也许你就会有疑问了,done/fail这些方法是哪个对象上的?$.ajax()返回了什么对象,为什么有这两个方法?
    答案就在下面介绍的Deferred对象。
     
    jQuery提供了一种新的类型Deferred。通过$.Deferred()来生成。例如
    var def = $.Deferred();
    这个def继承了很多方法,有done/fail/resolve/reject等。
    所以这里我们也就知道,上面$.ajax()其实返回的也就是这个对象。
     
    deferred对象有很多方法,这里介绍几种常用的,更多的可以参考 API
     
    首先自然是生成一个def对象。这里有很多方法,比如:
    var def = $.Deferred();    // 自己生成
    $.ajax({});    // ajax方法返回的也是def对象
    $.when();    // when方法也会返回一个def对象
    这里,$.when()可以单独讲讲,这个方法通常接收一个或多个deferred对象,然后根据这些deferred对象的状态情况,来决定$.when()返回的对象的状态。其中有个使用场景就是多个ajax请求,如果其中一个失败就都算失败,那么便可以在$.when()中传入多个ajax方法,例如$.when($.ajax(), $.ajax())。然后$.when会返回一个def对象(根据这两个请求结果的来判断)。
     
    接着得到了def对象,便有了一系列改变这个对象状态的方法
    def.resolve();    // 把def对象设置成已经完成,然后便会立刻执行绑定在def.done()里面的函数。
    def.reject();    // 把def对象设置成已经失败,然后便会立刻执行绑定在def.fail()里面的函数。
    def.notify();    // def对象执行中,对应的回调是def.progress()。
    紧接着是设置回调的方法,顺序和上面的对应,也就是什么状态会调用到什么回调
    def.done();    // 对应def.resolve();
    def.fail();    // 对应def.reject();
    def.progress();    // 对应 def.notify();
    
    // 特殊的
    def.always();    // 成功或者失败都会调用
    def.then();    // 接受多个函数,按顺序依次是成功(done),失败(fail)和进行中(progress)
    其实到这里位置,deferred对象的用法也就差不多了。不过jQuery还提供了几个API
    // 检查当前状态类
    def.isRejected();
    def.isResolved();
    def.state();
    这几个api顾名思义,就不具体讲了,具体可以查看上面给的jQuery API文档。
     
    还有一个方法,就是有时候我们希望给外部一个def对象,然后这个对象可以设置各种状态的回调,但是不能改变它的状态,那么就可以用
    def.promise();
    返回一个promiese对象,是deferred对象的子集,可以用done/fail等方法,没有resolve/reject等方法,主要是为了保护不让外部去修改def对象的状态。
     
    至此,关于promise已经全部讲完,大家现在就可以把它用在自己的项目中了,另外提早给大家拜个早年,祝大家羊年洋洋得意^ ^。
     
     
     
    转载本站文章请注明作者和出处 奇葩一朵朵 – http://www.cnblogs.com/season-huang/ ,请勿用于任何商业用途
  • 相关阅读:
    printf()函数不能直接输出string类型
    HDU 6166.Senior Pan()-最短路(Dijkstra添加超源点、超汇点)+二进制划分集合 (2017 Multi-University Training Contest
    计蒜客 17119.Trig Function-切比雪夫多项式+乘法逆元 (2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F)
    POJ 1195.Mobile phones-二维树状数组
    HDU 1541.Stars-一维树状数组(详解)
    ACM中常见错误对应表
    HDU 6112.今夕何夕-蔡勒公式 (2017"百度之星"程序设计大赛
    hdu 2126 Buy the souvenirs 二维01背包方案总数
    codevs 1017 乘积最大 dp
    bzoj 2705: [SDOI2012]Longge的问题 欧拉函数
  • 原文地址:https://www.cnblogs.com/season-huang/p/4284137.html
Copyright © 2011-2022 走看看