function foo(){
return new Promise((resolve,reject)=>{
let random = Math.random(); //声明随机数
if(random>0.5){
resolve(random);
} else{
reject(random);
}
});
}
//调用
foo().then((a)=>{
console.log('success:',a);
}).catch((b)=>{
console.log('error:',b);
});
上面代码中,函数foo返回一个Promise对象,Promise对象的参数为resolve,reject,箭头函数中声明一个随机数,如果大于0.5,则返回resolve,调用then函数,输出success。
cnost p1 = new Promise(function(resolve,reject){
setTimeout(()=> reject(new Error('fail')),3000)
})
const p2 = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(p1),1000
})
})
p2.then(()=>{
console.log(result);
}).catch(()=>{
console.log(error);
});
//4s后返回 Error:fail
上面代码中,p1
是一个 Promise,3 秒之后变为reject
。p2
的状态在 1 秒之后改变,resolve
方法返回的是p1
。由于p2
返回的是另一个 Promise,导致p2
自己的状态无效了,由p1
的状态决定p2
的状态。所以,后面的then
语句都变成针对后者(p1
)。又过了 2 秒,p1
变为reject
,导致触发catch
方法指定的回调函数。
new Promise((resolve,reject)=>{
resolve(1);
console.log(2);
}).then((a)=>{
console.log(a);
});
//2
//1
上面代码中,调用resolve
或reject
并不会终结 Promise 的参数函数的执行。
new Promise((resolve, reject) => {
return resolve(1);
// 后面的语句不会执行
console.log(2);
})
上面代码中,调用resolve
或reject
以后,Promise 的使命就完成了,后继操作应该放到then
方法里面,而不应该直接写在resolve
或reject
的后面。