Promise对象是什么_Promise对象怎么解析使用
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
推荐阅读
-
JavaScript 标准内置对象Promise使用学习总结
-
ES6-promise对象的使用
-
JavaScript 标准内置对象Promise使用学习总结
-
node.js Promise对象的使用方法实例分析
-
原生Javascript使用Promise对象借助关键字async&await设置JS休眠时间
-
在jQuery1.5中使用deferred对象 着放大镜看Promise_jquery
-
javascript使用Promise对象实现异步编程_javascript技巧
-
javascript使用Promise对象实现异步编程_javascript技巧
-
ES6-promise对象的使用
-
在jQuery1.5中使用deferred对象 着放大镜看Promise_jquery