Promise
callback hell
//获取第一份数据
$.get(url1,(data1)=>{
console.log(data1)
//获取第二份数据
$.get(url2,(data2)=>{
console.log(data2)
//获取第三份数据
$.get(url3,(data3)=>{
console.log(data3)
})
})
})
Promise
function getData(url){
return new Promise((resolve,reject)=>{
$.ajax({
url,
success(data){
resolve(data)
},
error(err){
reject(err)
}
})
})
}
用promise 获取数据 .then是单层的,是管道形式
const url1='/data1.json'
const url2='/data2.json'
const url3='/data3.json'
getData(url1).then(data1=>{
console.log(data1)
return getData(url2)
}).then(data2=>{
console.lg(data2)
return getData(url3)
}).then(data3=>{
console.log(data3)
}).catch(err=>console.error(err))
异步和同步的区别
- 基于JS是单线程语言
- 异步不会阻塞代码执行
- 同步会阻塞代码执行
promise加载一个图片
const url1 ="https://cdn.rsjoomla.com/images/blog/easter2017/blog-easter-2017.jpg"
const url2="https://www.crazyparts.co.nz/media/wysiwyg/home_page/promotion/easter/Easter-event-1200.jpg"
function loadImg(src){
return new Promise(
(resolve,reject)=>{
const img = document.createElement('img')
img.onload=()=>{
resolve(img)
}
img.onerror=()=>{
const err = new Error('fail to load image${src}')
reject(err)
}
img.src=src
}
)
}
/* loadImg(url).then(img=>{
console.log(img.width)
return img
}).then(img=>{
console.log(img.height)
}).catch(ex=>console.error(ex)) */
loadImg(url1).then(img=>{
console.log(img.width)
return img //普通对象
}).then(img=>{
console.log(img.height)
return loadImg(url2)// promise 实例
}).then(img2=>{
console.log(img2.height)
return img2
}).then(img2=>{
console.log(img2.width)
}).catch(ex=>console.error(ex))