一个现实生活中的例子让你理解Promise的使用场景

时间:2022-07-26
本文章向大家介绍一个现实生活中的例子让你理解Promise的使用场景,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

假设你有一个好朋友的孩子即将在本月出生,具体出生日期不确定,孩子的性别不确定,你每月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);
})