首先强调的是“Promise”是对象,也就是说与其他JavaScript对象的用法,没有什么两样;其次,它起到代理作用(proxy),充当异步操作与回调函数之间的中介。它使得异步操作具备同步操作的接口,使得程序具备正常的同步运行的流程,回调函数不必再一层层嵌套。

Promise 对象是 CommonJS 工作组提出的一种规范,目的是为异步操作提供统一接口,简单说,它的思想是,每一个异步任务立刻返回一个Promise对象,由于是立刻返回,所以可以采用同步操作的流程。这个Promises对象有一个then方法,允许指定回调函数,在异步任务完成后调用。

前文说了Promise对象提供异步操作接口,简而言之就是:执行异步任务时返回一个Promise对象,并且Promise对象只有三种状态:

  1.异步操作“未完成”(pending)

  2.异步操作“已完成”(resolved,又称fulfilled)

  3.异步操作“失败”(rejected)

三种状态的转换只有两种途径:   异步操作从“未完成”到“已完成”   =>  异步操作从“未完成”到“失败”。所以这种变化只能发生一次,一旦当前状态变为“已完成”或“失败”,就意味着不会再有新的状态变化了。因此,Promise对象的最终结果只有两种:{

  • 异步操作成功,Promise对象传回一个值,状态变为resolved
  • 异步操作失败,Promise对象抛出一个错误,状态变为rejected

Promise对象使用then方法添加回调函数。then方法可以接受两个回调函数,第一个是异步操作成功时(变为resolved状态)时的回调函数,第二个是异步操作失败(变为rejected)时的回调函数(可以省略)。一旦状态改变,就调用相应的回调函数。

那么promise对象是怎么生成的呢?

其实ES6提供了原生的Promise构造函数,用来生成Promise实例。下面代码创造了一个Promise实例。(跟声明对象new一样的方式)

var promise = new Promise(function(resolve, reject) {
// 异步操作的代码 if (/* 异步操作成功 */){
resolve(value);
} else {
reject(error);
}
});

resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从Pending变为Resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从Pending变为Rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。

Promise实例生成以后,可以用then方法分别指定Resolved状态和Reject状态的回调函数。

po.then(function(value) {
// success
}, function(value) {
// failure
});

Promise 封装的代码肯定是同步的, 那么这个 then 的执行是异步的吗?  可以通过以下这个有意思的小例子可以知道Promise对象的执行顺序

setTimeout(function() {
console.log(1)
}, 0);
new Promise(function executor(resolve) {
console.log(2);
for( var i=0 ; i<10000 ; i++ ) {
i == 9999 && resolve();
}
console.log(3);
}).then(function() {
console.log(4);
});
console.log(5); ==》》2 3 5 4 1

以上是我看一篇博文里的一段代码(出自),可以参考一下奥

最新文章

  1. vim技巧
  2. eclipse中Maven创建WEB项目
  3. js-sort数组排序
  4. 使用SQL如何把用逗号等字符隔开的字符串转换成列表(转)
  5. linux常用命令 (mac ),积少成多
  6. Linux中升级更新命令yum upgrade和yum update的区别
  7. 11-UIView与核心动画对比
  8. 最全的dedeCMS标签调用技巧和大全
  9. svn - 常用命令
  10. java_method_获取数据库中列表的第一行第一列的int值
  11. Js 使用new关键字调用函数和直接调用函数的区别
  12. jquery ajax标准写法
  13. Swift基础之自定义PUSH和POP跳转动画
  14. Vue生命周期,面试常见问题
  15. flask刷新token
  16. golang 常量的用法
  17. 七、Builder 建造器模式
  18. VB6 获取和设置默认打印机
  19. 通过Jmeter对Dubbo接口进行接口及性能测试
  20. day 03 字符串 for 循环

热门文章

  1. Shiro第三篇【授权、自定义reaml授权】
  2. 02_Ext_Panel
  3. mongodb 常用的命令
  4. DI in ASP.NET Core
  5. OC——关于KVO
  6. String的内存模型,为什么String被设计成不可变的
  7. Cookie实现登录记住密码
  8. apollo实现c#与android消息推送(三)
  9. 17.tslib安装以及使用
  10. 史上前端面试最全知识点(附答案)---html &amp; js &amp; css