概念
promise对象代表了一个异步操作的结果(成功或失败);
诞生的缘由
在没有promise的时候,当我们处理异步操作时,会使用回调函数作为参数来处理响应结果;如果存在连续多个且有依赖的异步操作时,比如后面的异步操作需要前面异步操作的响应数据作为请求参数,那么我们必须在前面异步操作的回调函数里发送后续的异步操作,以此类推,就会出现“回调地狱”。导致函数过长,阅读性差;因此promise产生了,它采用同步的写法(链式调用)来处理异步回调。
以前的写法
doSomething(successCallback,failCallback);
多个连续异步回调时
doSomething(function successCallback(){
doSecondSomething(function successCallback(){
...
},failCallback);
},failCallback);
现在的写法
var promise=doSomething();
promise.then(successCallback,failCallback);
或者
doSomething().then(successCallback,failCallback);
多个连续异步回调时
doSomething().then(successCallback,failCallback).then(successCallback,failCallback)
保证
为什么promise可以替代回调嵌套呢?
因为promise定义了几个保证:
1.在javaScript事件队列的当前运行完成之前,回调函数永远不会执行;
2.通过.then方法添加的回调函数,甚至在异步操作完成之后才添加的函数,都会被执行。
3.通过多次调用.then方法,可以添加多个回调函数,它们会按照插入的顺序独立运行。
链式调用
promise的链式调用是因为then()和catch()返回一个新的promise对象,跟原来的不同。
var promise=doSomething();
var promise2=promise.then(successCallback,failCallback);
第二个promise不仅代表doSomething()的完成,也代表了回调函数successCallback或者failCallback的完成