为什么需要在项目中引入promise?

项目起因:我们在页面中经常需要多次调用接口,而且接口必须是按顺序串联调用

(即A接口调用完毕,返回数据后,再调用B接口)

这样就会造成多次回调,代码长得丑,而且不好维护,这就是传说中的 回调地狱(Callback Hell)

官方起因:为了我们的代码更加具有可读性和可维护性,我们需要将数据请求与数据处理明确的区分开来

(几乎介绍promise的文章都有这么一句话,我就借用理解下)

1、promise

1.1、官方解释:

The Promise object is used for asynchronous computations. A Promise represents a single asynchronous operation that hasn't completed yet, but is expected in the future.

译文:Promise对象用于异步操作,它表示一个尚未完成且预计在未来完成的异步操作。

  1.2、基本语法

//构建Promise
var promise = new Promise(function (resolve, reject) {
    if (/* 异步操作成功 */) {
        resolve(data);
    } else {
        /* 异步操作失败 */
        reject(error);
    }
});

类似构建对象,我们使用new来构建一个PromisePromise接受一个「函数」作为参数,该函数的两个参数分别是resolvereject。这两个函数就是就是「回调函数」,由JavaScript引擎提供。

resolve函数的作用:在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;

reject函数的作用:在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

1.3、Promise对象代表一个未完成、但预计将来会完成的操作。

它有以下三种状态:

    •  pending :初始值,不是fulfilled,也不是rejected
    •  fulfilled  :代表操作成功
    •  rejected :代表操作失败

Promise有两种状态改变的方式,既可以从pending转变为fulfilled,也可以从pending转变为rejected

一旦状态改变,就「凝固」了,会一直保持这个状态,不会再发生变化。

即,执行完 resolve(data); 再执行reject(error), 状态仍然是成功,不会被重新改变

当状态发生变化,promise.then绑定的函数就会被调用。

注意:Promise一旦新建就会「立即执行」,无法取消。这也是它的缺点之一。

 1.4、基本API

.then()

语法:Promise.prototype.then(onFulfilled, onRejected)

对promise添加onFulfilledonRejected回调,并返回的是一个新的Promise实例(不是原来那个Promise实例),且返回值将作为参数传入这个新Promise的resolve函数。

因此,我们可以使用链式写法,如上文的例2.7。由于前一个回调函数,返回的还是一个Promise对象(即有异步操作),这时后一个回调函数,就会等待该Promise对象的状态发生变化,才会被调用。

最新文章

  1. 【Java EE 学习 79 上】【mybatis 基本使用方法】
  2. iOS原生项目中集成React Native
  3. SharePoint 2013 Workflow 分布式配置问题记录
  4. xampp 用phpmyadmin在页面上修改密码后,无法登陆,密码没问题
  5. 新建DragonBones动画文件
  6. [Head First Python]5. 推导数据:处理数据
  7. Eventlog控件的使用
  8. 【Python】 virtualenv虚拟环境建设和管理
  9. [转]CDH QuickStart VM基本使用
  10. Mac 桌面软件开发基础问答
  11. Delphi控件cxGrid 如何动态创建列?
  12. java-nio之zero copy深入分析
  13. 【转载】maven入门1
  14. SQL查询效率where语句条件
  15. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整
  16. ZK Leader选举
  17. Spring Cloud与微服务构建:Spring Cloud简介
  18. Linux rdate 命令
  19. asp.net 服务器控件的 ID,ClientID,UniqueID 的区别
  20. HUST 1328 String (字符串前缀子串个数 --- KMP)

热门文章

  1. Hexo系列(三) 常用命令详解
  2. 我理解的数据结构(三)—— 队列(Queue)
  3. 1.IDEA的安装
  4. QuickTest Professional对web网站进行测试后没有生成脚本信息解决办法
  5. Python中对两种utf-8格式的理解
  6. js实现的时间轴效果
  7. raize5的修改。
  8. 《Android源代码设计模式解析与实战》读书笔记(八)
  9. Value Stewardship Over Showmanship
  10. DNS通道检测 国内学术界研究情况——研究方法:基于特征或者流量,使用机器学习决策树分类算法居多