promise的简单理解
现在来总结一下对promise简单的理解吧,首先来讲讲回调地狱,
假设我们加载1.js没问题,我们就加载2.js,加载2.js没问题,我们就加载3.js。。。。。
1 loadScript('1.js', function(error, script) { 2 3 if (error) { 4 handleError(error); 5 } else { 6 // ... 7 loadScript('2.js', function(error, script) { 8 if (error) { 9 handleError(error); 10 } else { 11 // ... 12 loadScript('3.js', function(error, script) { 13 if (error) { 14 handleError(error); 15 } else { 16 // ...加载完所有脚本后继续 (*) 17 } 18 }); 19 20 } 21 }) 22 } 23 });
如果调用嵌套的增加,代码层次变得更深,维护难度也随之增加,尤其是我们使用的是可能包含了很多循环和条件语句的真实代码,而不是例子中的 ...
。
有时这些被称为“回调地狱”或“厄运金字塔”。(资料原地址:https://zh.javascript.info/callbacks),为了避免这种情况的出现,我们出现了promise,
首先介绍一下promise
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理且更强大。
Promise对象有三种状态
- pending: 初始状态,不是成功或失败状态。
- fulfilled: 意味着操作成功完成。
- rejected: 意味着操作失败。
动态可以从pending->fulfilled 或者从pending到rejeected 且一旦改变就不可能再变
Promise 构造函数包含一个参数和一个带有 resolve(解析)和 reject(拒绝)两个参数的回调。在回调中执行一些操作(例如异步),如果一切都正常,则调用 resolve,否则调用 reject。
1 var promise = new Promise(function(resolve, reject){ 2 // 3 4 if (/* 异步操作成功 */) { 5 resolve(value); 6 } else { 7 reject(error); 8 } 9 })
对于已经实例化过的 promise 对象可以调用 promise.then() 方法,传递 resolve 和 reject 方法作为回调。
promise.then() 是 promise 最为常用的方法。
promise.then(onFulfilled, onRejected)
promise简化了对error的处理,上面的代码我们也可以这样写:
promise.then(onFulfilled).catch(onRejected)
然后我们就可以采用.then或者.catch的方式进行调用resolve代表成功,如果成功后就执行.then,reject代表失败,失败后就执行.catch
我们来看看例子吧
let promise = new Promise(function(resolve){ resolve() }); promise.then(() => console.log("执行成功"));