先上代码
let remember = true;
let getMoney = new Promise((resolve,reject)=>{
if(remember){
let money = 999
resolve(money)
}else{
let noMoney = new Error('今年你已经毕业了,没有红包了');
reject(noMoney)
}
})
let test = function(){
getMoney.then((fulfilled)=>{
console.log(fulfilled);
}).catch((rejected)=>{
console.log(rejected.message);
})
}
test()
这里要实现的是 过年了 到了找家长要红包的时候了 看看家长还记得不记得给你红包
这里要用到promise
大家都知道promise是一种比较好的实现异步操作的方法
一 . 第一点 说一下promise里面的状态 pending待解决 fulfilled已解决 rejected拒绝
在新建一个promise的时候呢 状态为pending 如果已成功 状态更改为fulfilled 失败rejected
并且此状态为一次性改变 且不可逆
可以理解为 家长给你红包 承诺(promise)过年给红包了 然后你在那等过年 你也不知道家长给不给 此时状态为pending
代码中定义的remember 为 true时 代表 家长记得给你红包了 那么状态就会更改为fulfilled
如果为flase 家长不是不记得 而是他说今年该毕业了 不能在给你红包了 就是找借口不给了 说话不算数了 此promise不实现了 状态更改为rejected
二. 第二点 resolve 和 reject
这是promise的参数 同时呢 也可以把他们看做是一个函数 一个方法 看作一个执行器
当成功时候执行resolve
失败时候执行reject
并且这两种方法在创建promise中是立刻同步调用的 不会排在队列中
三. then()和catch()
看网上很多资料 有很多解释的 我大概以我的理解 用最简单的话描述一下
Promise.prototype.then() 我们可以看到then和catch 方法是存在Promise实例原型中的
所以才可以用.来调用
then(成功,失败) then里面有两个参数 一是成功捕获 二是失败捕获 二者均为方法
如果实在难理解 可以理解为 .catch就是.then的第二个参数
// bad
promise
.then(function(data) {
// success
}, function(err) {
// error
});
// good
promise
.then(function(data) { //cb
// success
})
.catch(function(err) {
// error
});
上代码 大家可以对比一下
Promise.prototype.catch = function(fn){
return this.then(null,fn);
}
那么为什么这样用 区别就是 如果在then的第一个函数里抛出了异常,后面的catch能捕获到,而then的第二个函数捕获不到
所以一般上来讲 都是用.catch
这样的话我觉得最上面的代码应该是可以看懂并使用的了
如果有想更进一步了解其底层原理 请看手写原理层promise