一、基本用法
异步不一定是顺序出现的,若想顺序出现可通过回调函数的嵌套:
上面方法不推荐使用。推荐使用promise
- 实例化promise对象,构造函数中传递函数,该函数中用于处理异步任务
- resolve 和reject两个参数用于处理成功和失败两种情况,并通过p.then获取处理结果
<script type="text/javascript">
// console.log(typeof Promise);
// console.dir(Promise);
var p = new Promise(function(resolve,reject){
setTimeout(function(){
var flag = true;
if(flag){//正常情况
resolve('hello');
}else{//异常情况
reject('出错了');
}
},100);
});
p.then(function(data){
console.log(data)
},function(info){
console.log(info)
});
</script>
二、基于promise处理Ajax
<script type="text/javascript">
function queryData(url){
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.responseText);
}else{
//处理异常情况
reject('服务器错误');
}
};
xhr.open('get',url);
xhr.send(null);
});
return p;
}
queryData('http://localhost:3000/data')
.then(function(data){ 接受正常情况下:
console.log(data);
},function(info){ 接受错误服务器情况下:
console.log(info)
})
</script>
三、promise常用的API
p.then()
得到异步任务的正确结果
p.catch()
获取异常信息
p.finally()
成功与否都会执行
<body>
<script type="text/javascript">
//promise常用的API-实例方法
function foo(){
return new Promise(function(resolove, reject){
setTimeout(function(){
resolove(123);
},100);
})
}
foo()
.then(function(data){ 正常情况下
console.log(data)
})
.catch(function(data){ 错误情况下
console.log(data)
})
.finally(function(){ 最终执行
console.log('finished')
})
</script>
</body>
上面的foo函数又可以写成(通过Ajax发送请求,并且保持顺序)
then参数中函数的返回值
对象方法
- promise.all()并发处理多个异步任务,所有任务都执行完才能得到结果
- promise.race()并发处理多个异步任务,只要有一个任务完成就能的到结果