假设你有一个好朋友的孩子即将在本月出生,具体出生日期不确定,孩子的性别不确定,你每月15号发工资,你希望在你有工资的情况下 ,等孩子出生第一时间知道孩子的性别,给孩子买一个合适的礼物。在这种场景下你需要做两件等待的事情,1 :孩子什么时候出生及孩子的性别 2 :等你发工资。
现在我们来用Promise模拟这个应用场景
// 假设今天是月初的第一天
// 用随机数A模拟孩子出生的日期
// 用随机数B模拟孩子的性别 0是女孩 1是男孩
// 用随机数C来模拟当月的工资 (销售人员的工资随机性比较大)
console.log('---------先知的预测------------')
let A = Math.floor(Math.random() * 30) + 1;
console.log('孩子将在本月' + A + '日出生');
let B = Math.round(Math.random() * 1);
console.log('孩子的性别是' + B === 1 ? "男孩" : "女孩");
let C = Math.floor(Math.random() * 1000) + 3000 // 3000元底薪+0-1000元的随机绩效
console.log('当月工资是' + C);
console.log('-----------先知预测结束--------------------');
//我们定义一个promise对象promiseBirth 因为今天是月初,我们等待孩
//子出生的时间就从今天到孩子出生日的时长 比如今天是1号,孩子是13号出
//生,那么我们需要等13天(用13秒模拟)才知道孩子的性别 ,孩子的性别也是随机的
let promiseBirth = new Promise((resolve, reject) => {
setTimeout(() => { // 使用setTimeout模拟等待的过程
resolve(B); // 等待孩子出生之后,获取到孩子的性别
}, A * 1000)
})
// 我们在定义一个等待发工资的promise对象promiseMoney ,15号发工资模拟等待15秒
let promiseMoney = new Promise((resolve, reject) => {
setTimeout(() => { // 使用setTimeout模拟等待的过程
resolve(C); // 等到发工资日 就获取到了工资的实际数量
}, 15 * 1000)
})
// 制定购买礼物的决策
function decision(sex, money) {
if (sex) {
// 如果是男孩
if (money > 3500) {
// 如果钱足够多
console.log('买个男孩的礼物,价格可以贵点');
} else {
console.log('买个男孩的礼物,价格不要太贵');
}
} else {
if (money > 3500) {
// 如果钱足够多
console.log('买个女孩的礼物,价格可以贵点');
} else {
console.log('买个女孩的礼物,价格不要太贵');
}
}
}
let sex; // 使用sex存储孩子的性别
let money //使用money存储当月工资
// 常规做法 promise前套
console.log('----------安静的等待孩子出生-----------');
promiseBirth.then((res) => {
sex = res;
console.log('等到孩子出生了');
console.log('孩子的性别是' + res ? "男孩" : "女孩")
console.log('----------安静的等待发工资-----------');
promiseMoney.then((res2) => {
money = res2;
console.log('等到发工资了');
console.log('当月工资是' + res2);
// 知道了孩子的性别,工资数 这里可以做决策了 买什么样的礼物,费用预算是多少
console.log('在等待了' + (A + 15) + '秒之后 开始做决策');
decision(sex, money);
})
})
// 使用prmoise all
Promise.all([promiseBirth, promiseMoney]).then(() => {
console.log('使用Promise all 等待 获取到了孩子的性别 和当月的工资');
console.log('在等待了' + (A > 15 ? A : 15) + '秒之后 开始做决策');
// 开始做决策
decision(sex, money);
})