专题系列

Promise的前世今生

2018-03-15  本文已影响0人  2018_ieye

概念

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的完成

上一篇 下一篇

猜你喜欢

热点阅读