promise的用法
promise是一个构造函数,自身有all,resolve,reject等方法,原型上有then,catch等方法。并且它new的实例对象特包含这些方法。通常将他包在一个函数中然后返回一个promise对象。
function hins(){
let name = new Promise(function(resolve,reject){
setTimeout(function(){
console.log('异步执行完成');
resolve('hinschueng')
},1000);
});
return name
}
hins().then(function(data){
console.log(data)
})
promise接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。从表面上看,Promise可以简化层层回调的写法,即解决回调地狱的问题,但实质上,Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用。正确用法如下:
function Hins(){
var name = new Promise(function(resolve,reject){
setTimeout(function(){
console.log('异步执行完成1');
resolve('hinschueng');
},1000);
});
return name
}
function Hins1(){
var name = new Promise(resolve =>{
setTimeout(function(){
console.log('异步执行完成2');
resolve('yin')
},2000)
});
return name
};
function Hins2(){
var name = new Promise(resolve => {
setTimeout(function(){
console.log('异步执行完成3');
resolve('jiao')
},3000);
});
return name
}
Hins()
.then(function(data){
console.log(data);
return Hins1()
})
.then(data =>{
console.log(data);
return Hins2()
})
.then(data =>{
console.log(data);
})
reject和catch
reject的作用就是把Promise的状态变成"rejected",然后在then中执行“失败”的回调函数。
function Num(){
var p = new Promise((resolve,reject) => {
var n=2;
if(n>3){
resolve(n)
}else{
reject('数字太小了')
};
});
return p
}
Num()
.then(data => {
console.log(data)
},
reason =>{
console.log(reason)
})
catch的效果是和写在then里第二个参数一样,但是它有另一个作用:在执行resolve的回调函数时,如果抛出错误,不会报错卡死js,而是进入catch方法中。效果如下:
Num()
.then(data =>{
console.log(data);
console.log(somedata);//这个somedata没有定义
})
.catch(reason =>{
console.log('我被执行了')
console.log(reason)
})