这篇文章记录一下自己学习promise的心得,如果有不对的地方,欢迎各位指出!!
基础用法
学过promise,应该都了解到,这是js实现异步的一种方式,主要用于解决回调地狱的问题的,那么什么是回调地狱呢?
当我们在进行接口请求时,如果有碰到这么一种情况,请求完接口a,利用接口a的结果去请求接口b接口,再用接口b的结果去请求接口c ......
$.ajax({
url: '/a',
success: function(resA) {
$.ajax({
url: '/b',
data: {a: resA},
success: function(resB){
// ......
}
}) }
})
这个时候的回调函数是一层嵌套一层的,这就回调地狱的其中一种情况。这个时候的代码的可读性变得很差,所以我们可以用promise进行优化。
const a = function() {
new Promise((res, rej) => {
$.ajax({
url: '/a',
success(data) {
res(data)
}
})
})
}
const b = function(dataA){
return new Promise((res, rej) => {
$.ajax({
url: '/b',
data: {a: dataA},
success(data) {
res(data)
}
}) })
}
a().then(data => {
return b(data)
}).then(data => {
// ......
})
当我们把代码改为promise的写法时,看起来就方便很多了。
promise.all
记得早些时间面试的时候,有个面试官问我:“如何用promise实现图片按顺序加载?”,当时的我对于promise.all 这个方法并不是很熟悉,所以没有答上来。
all 方法的意思是,等待所有的promise程序都返回结果之后执行后续的程序,代码表现为:
let p1 = new Promise((resolve, reject) => { resolve('成功了')})let p2 = new Promise((resolve, reject) => { resolve('success')})let p3 = Promse.reject('失败')Promise.all([p1, p2]).then((result) => { console.log(result) //['成功了', 'success']}).catch((error) => { console.log(error)})Promise.all([p1,p3,p2]).then((result) => { console.log(result)}).catch((error) => { console.log(error) // 失败了,打出 '失败'})
上面的程序中一共有三个promise为p1、p2、p3,其中p1、p2是执行成功的,p3是失败的。
当我们用 all 方法监听 p1、p2时,因为监听的所有的promise都是成功的,所以程序进入then函数中,接收的参数result为一个数组,数组的每一项,是对应的监听顺序的每一项返回的参数。
这时候回到‘面试官’的问题,假设我们有10张图片,虽然每张图片加载的时间不同,但是我们可以在所有的图片加载完成之后,再按照顺序渲染到页面中,以实现按顺序加载图片。
而当我们用 all 方法监听 p1、p2、p3时,由于p3的执行失败了,所以程序就进入了catch中了,这个error接收的是失败的程序返回的值。
promise.race
let p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve('success') },1000)})let p2 = new Promise((resolve, reject) => { setTimeout(() => { reject('failed') }, 500)})Promise.race([p1, p2]).then((result) => { console.log(result)}).catch((error) => { console.log(error) // 打出的是 'failed'})
race方法说的是,当程序中的任意一项执行完成后,执行后续的then或者catch。
示例中p2的程序是0.5s执行完成的,所以程序进入的catch函数。
当两个程序都是成功的时候,哪个promise先执行完成,then就接收到谁的参数执行后面的内容了,后面的promise执行完成就不会再触发then函数了
感谢各位观看!!!
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!