1.提到promise我们就不得不说一下回调地狱(回调缺点1)
回调地狱:指的是回调嵌套过多的情况,导致代码很难被看懂。
let arr=[];
function aa(fn){
fn('一只狗')
}
function bb(fn){
fn('一只猫')
}
function cc(数量,callback){
arr.push(数量)
console.log(arr)
if(callback){
callback
}
}
// 开始调用 如果比这再多几层,就不容易看懂了
aa(function(狗数){
console.log(狗数)
cc(狗数, function(){
bb(function(猫数){
console.log(猫数)
cc(猫数)
})
})
})
Promise的目的
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。
2.实现原理
ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。通过在函数内部return 一个 Promise对象的实例,这样就可以使用Promise的属性和方法进行下一步操作了。
function 函数名(){
return new Promise(function(resolve, reject) {
// ... some code
if (/* 异步操作成功 */){
resolve(value); // 异步操作成功时调用,把结果作为参数传递出去
} else {
reject(error); // 异步失败时调用,把错误作为参数传递出去
}
})
}
-
Promise 的使用
3.1 Promise 的属性与方法
属性
Promise.prototype 表示 Promise 构造器的原型
方法
Promise.prototype.then()
返回一个 Promise 。它最多需要有两个参数:Promise 的成功和失败情况的回调函数。
Promise.prototype.catch()
返回一个Promise,并且处理拒绝的情况。等价于Promise.prototype.then(undefined, onRejected)
Promise.prototype.finally()
finally() 方法返回一个Promise,在执行then()和catch()后,都会执行finally指定的回调函数。避免同样的语句需要在then()和catch()中各写一次的情况。
Promise.all(iterable)
返回一个 Promise 实例,iterable参数内所有的 promise 都resolved后,才回调完成resolve。
Promise.race(iterable)
返回一个 promise ,并伴随着 promise对象解决的返回值或拒绝的错误原因, 只要 iterable 中有一个 promise 对象”解决(resolve)”或”拒绝(reject)”。
Promise.resolve()
返回一个以给定值解析后的Promise对象。但如果这个值是个thenable(即带有then方法),返回的promise会“跟随”这个thenable的对象,采用它的最终状态(指resolved/rejected/pending/settled);如果传入的value本身就是promise对象,则该对象作为Promise.resolve方法的返回值返回;否则以该值为成功状态返回promise对象。
Promise.reject()
返回一个带有拒绝原因reason参数的Promise对象。
3.2 将回调地狱中的例子,改为Promise的形式let arr=[]; function aa(){ return new Promise(function(res,rej){ res('一只狗') }) } function bb(fn){ return new Promise(function(res,rej){ res('一只猫') }) } function cc(数量,callback){ return new Promise(function(res,rej){ arr.push(数量) console.log(arr) res() }) } aa() .then(cc) .then(bb) .then(cc)
可以看到使用Promise后,逻辑变得非常直观
在这里推荐大家去看一个关于Promise的博客,写的非常好。
https://blog.csdn.net/shan1991fei/article/details/78966297