// Promise 承诺 现在许下诺言,将来会知道结果(可能好,可能不好)
// 语法
// 参数是一个回调函数 ---一般写异步程序
// 结果是好的,就调用函数的第一个参数(也是个函数),如果结果是不好的,就调用函数的第二个参数
// Promise 本身就是构造函数
// 本身由两个属性
// [[PromiseState]] 表示一种状态 pending /fulfilled /rejected
// pending 承诺的过程
// 假如兑现了承诺 就会变成fulfilled
// 假如没有兑现承诺 就会变成rejected
// [[PromiseResult]] 表示结果的值---无论成功或者失败
// 买彩票 双数中奖,单数不中
const p1 = new Promise(function (resolve, reject) {
setTimeout(() => {
const n = parseInt(Math.random() * 100);
if (n % 2 === 0) {
resolve(n)
} else {
reject(n)
}
}, 1000)
})
// console.log(p);
// promise 本身的语法
// 1 then 有两个参数,第一个参数为成功时候调用,第二个为失败时调用 ,对应上面的 resolve 和reject
// 2 catch 只接受 失败
// 3 finally 无论成功或者失败都会接受
// 而且这三种方法都返回promise实例化对象,默认是自己
const p2 = new Promise(function (resolve, reject) {
setTimeout(() => {
const n = parseInt(Math.random() * 100);
if (n % 2 === 0) {
resolve(n)
} else {
reject(n)
}
}, 1000)
})
p2.then(data => {
console.log('中奖号码' + data);
}, err => {
console.log('没有中奖:' + err)
})
p1.then(data => {
console.log('成功' + data);
}).finally(() => {
console.log('成功失败都会出来');
}).catch(err => {
console.log('失败' + err);
})
p2.catch(err => {
console.log('失败' + err);
}).finally(() => {
console.log('成功失败都会出来');
}).then(data => {
console.log('成功' + data);
})
// 当直接判断为成功的时候,根本不会走catch方法,但是判断为失败的时候,会进入then方法,此时的then方法中只有正确的,所以结果是undefined
// 放回的对象也可以不是自己,可以是其他的实例化对象,从而实现链式调用
p1.then(data => {
console.log('成功' + data);
return p2
}).then(data => {
console.log('成功' + data);
})
// promise 静态方法 all 和 race
// all 当所有成功的时候才算成功,但是只要有一个失败,就返回失败的那个
const res = Promise.all([p1, p2])
console.log(res); //此时的res为一个promise实例化对象
res.then(data => {
console.log(data);
}).catch(err => {
console.log(err);
})
// race 全部promise比赛,谁先完成返回谁的结果 ,无论是成功还是失败
const res2 = Promise.race([p1, p2])
res2.then(data => {
console.log(data);
}).catch(err => {
console.log(err);
})
// promise 的快速创建
// 快速创建成功promise
const p4 = Promise.resolve(1)
// 快速创建失败promise
const p5 = Promise.reject(2)
// promise 本身是异步还是同步的?
// promise本身是同步的,但是promise的方法是异步的
// 建议promise里面写异步代码,但是也可以写同步代码
const p = new Promise((resolve, reject) => {
console.log(2); // 会直接打印
setTimeout(() => {
const n = parseInt(Math.random() * 100);
if (n % 2 === 0) {
resolve(n)
} else {
reject(n)
}
}, 1000)
})
p
.then(
data => {
console.log(data);
}
)
.catch(
err => {
console.log(err);
}
)