异步传输:定时任务,ajax,事件任务
多次异步传输的顺序无法确定,不能依赖
必须依赖的话就需要嵌套关系(回调地狱,代码可读性低,故需要Promise!)
<script>
console.log(typeof Promise)
console.dir(Promise)
var vm = new Promise(function(receive,reject){
setTimeout(function(){
flag = false
if(flag){
receive('成功');
}else{
reject('出错了');
}
},100)
})
vm.then(function(data){
console.log(data)
},function(info){
console.log(info)
})
</script>
</body>
Promise基本用法,即用then来代替回调函数,实现异步事件的顺序输出
<script>
function queryData(){
var p = new Promise(function(resolve,reject){
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function(){
if(xhr.readyState != 4) return
if(xhr.readyState == 4 && xhr.status == 200){
resolve(xhr.readyState)
}
else{
reject('发生错误')
}
}
xhr.open('get',url)
xhr.send(null)
})
return p
}
//queryData('http://xxxxx').then(function(data){
//console.log(data)
//},function(info){
// console.log(info)
//})
//===============================
queryData('http://xxxxx')
.then(function(data){
console.log(data)
return queryData('http://yyyy')
}).then(function(data){
console.log(data)
return queryData('http://yyyy')
}).then(function(data){
console.log(data)
return queryData('http://zzz')
})
</script>
</body>
then()函数参数中的返回值:
1 返回Promise实例对象
2 返回普通值进行接收
Promise常用API:
.then()
.catch()
.finally()
Promise.all() 并发处理多哥异步任务,全部执行完后获得结果
Promise.race() ~ 返回最快处理完的结果
<script>
function queryData(){
var p = new Promise(function(resolve,reject){
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function(){
if(xhr.readyState != 4) return
if(xhr.readyState == 4 && xhr.status == 200){
resolve(xhr.readyState)
}
else{
reject('发生错误')
}
}
xhr.open('get',url)
xhr.send(null)
})
return p
}
var p = new Promise('http://xxxxx')
var p2 = new Promise('http://xxxxx')
var p3= new Promise('http://xxxxx')
Promise.all([p,p2,p3])
.then(function(data){
console.log(data)
}).catch(function(data){
console.log(data)
}).finally(function(data){
console.log('finally')
})
</script>
</body>
fetch是ajax的升级版,基于Pormise