Promise对象是什么_Promise对象怎么解析使用
2017-06-01 13:14:59  By: dwtedx

1、Promise思想

每一个异步任务立刻返回一个Promise对象、由于是立刻返回、所以可以采用同步操作的流程、这个Promises对象有一个then方法、允许指定回调函数、在异步任务完成后调用

// 传统写法
step1(function (value1) {
  step2(value1, function(value2) {
    step3(value2, function(value3) {
      step4(value3, function(value4) {
        // ...
      });
    });
  });
});

// Promises的写法
(new Promise(step1))
  .then(step2)
  .then(step3)
  .then(step4);


传统的回调函数写法使得代码混成一团、变得横向发展而不是向下发展、Promises规范就是为了解决这个问题而提出的、目标是使用正常的程序流程(同步)、来处理异步操作、它先返回一个Promise对象、后面的操作以同步的方式、寄存在这个对象上面

等到异步操作有了结果、再执行前期寄放在它上面的其他操作、ECMAScript 6将其写入语言标准、因此目前JavaScript语言原生支持Promise对象


2、Promise接口

接口状态

(1)未完成 pending

(2)完成 resolved或者fulfilled

(3)失败 rejected


状态变化途径

(1)未完成-完成

(2)未完成-失败


Promise对象最终结果

(1)异步操作成功、Promise对象传回一个值、状态变为resolved

(2)异步操作失败、Promise对象抛出错误、状态变为rejected


then方法

Promise对象使用then方法添加回调函数、then方法可以接受两个回调函数、一个是异步操作成功(状态为resolved)时的回调函数、一个是异步操作失败(状态为rejected)时的回调函数

then方法可以链式调用

po
  .then(step1)
  .then(step2)
  .then(step3)
  .then(
    console.log,
    console.error
  );


上面代码中、po的状态一旦变为resolved、就依次调用后面每一个then指定的回调函数、每一步都必须等到前一步完成、才会执行、最后一个then方法的回调函数console.log和console.error、用法上有一点重要的区别、console.log只显示回调函数step3的返回值、而console.error可以显示step1、step2、step3之中任意一个发生的错误、也就是说、假定step1操作失败、抛出一个错误、这时step2和step3都不会再执行了(因为它们是操作成功的回调函数、而不是操作失败的回调函数)、Promises对象开始寻找、接下来第一个操作失败时的回调函数、在上面代码中是console.error、这就是说、Promises对象的错误有传递性


3、Promise对象的生成

ES6提供了原生的Promise构造函数、用来生成Promise实例

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


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


4、Promise用法辨析

(1)finalHandler回调函数的参数是doSomethingElse函数的运行结果

doSomething().then(function () {
  return doSomethingElse();
}).then(finalHandler);


(2)finalHandler回调函数的参数是undefined

doSomething().then(function () {
  doSomethingElse();
  return;
}).then(finalHandler);


(3)finalHandler回调函数的参数、是doSomethingElse函数返回的回调函数的运行结果

doSomething().then(doSomethingElse())
  .then(finalHandler);


(4)doSomethingElse会接收到doSomething()返回的结果

doSomething().then(doSomethingElse)
  .then(finalHandler);


5、Promise优缺点

优点:让回调函数变成了规范的链式写法、程序流程可以看得很清楚、如果一个任务已经完成、再添加回调函数、该回调函数会立即执行、所以、你不用担心是否错过了某个事件或信号

缺点:编写和理解都相对比较难

如有错误、请您指正!另外你也可以参考Promise官方文档:Promise


若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+