promise

1、普通回调函数
	煮粥的时候,如果一直等着粥熟是一件很无聊的事情,我们可以做些其他事情打磨时间,比如看电视,等到粥熟了,我们再关掉电视去吃饭。
	煮粥、看电视、吃饭三件事情,煮粥可以看成是请求数据、看电视是在等待数据请求成功时执行其他操作,吃饭就是数据请求成功后进行的操作。等到吃完饭还可以继续看电视。
function cook (eat) {
  console.log('做饭')
  setTimeout(function () {
    eat()
  }, 1000)
}

function eat () {
  console.log('饭熟了')
  console.log('吃饭')
}

cook(eat)
console.log('看电视')


运行结果:
做饭
看电视
饭熟了
吃饭

假如,饭煮熟后你还有其他事情要做。你爸爸在邻居家下象棋,你弟弟在大街上玩耍,你这个时候要去找你爸爸,让你爸去找你弟弟回家吃饭。等人齐了才能吃饭。

function cook (eat) {
  console.log('做饭')
  setTimeout(function () {
    eat(findFather)
  }, 1000)
}

function eat (findFather) {
  console.log('饭熟了')
  findFather(findBrother)
}

function findFather (findBrother) {
  console.log('小蝌蚪找爸爸')
  findBrother()
}

function findBrother () {
  console.log('你爸喊你回家吃饭')
  console.log('吃饭')
}

cook(eat)
console.log('看电视')

运行结果:
做饭
看电视
饭熟了
小蝌蚪找爸爸
你爸喊你回家吃饭
吃饭
此时嵌套了多个回调函数,代码阅读非常不直观,层级很不明显,对后期维护非常不利。回调函数就是在一个函数里面执行另外的一个函数。

promise

下面用promise实现上面的程序。在es6运行环境中创建一个promise对象,resolve是从状态从pending(进行中)变为fulfilled(已成功)执行的操作,reject是变为已失败进行的操作。状态变为已成功后,执行resolve,并把参数“饭熟了”传给then。

let cook = new Promise(function (resolve, reject) {
  console.log('做饭')
  resolve('饭熟了')
})
cook.then((cook) => {
  console.log(cook)
  console.log('吃饭')
})
console.log('看电视')

运行结果:
做饭
看电视
饭熟了
吃饭
Promise新建立即执行所以最先输出做饭,then方法在当前脚本所有同步任务执行完才执行,所以最后输出饭熟了、吃饭。

let findFater = new Promise(function (resolve, reject) {
  resolve('小蝌蚪找爸爸')
})
let findBrother = new Promise(function (resolve, reject) {
  resolve('你爸喊你回家吃饭')
})
let cook = new Promise(function (resolve, reject) {
  console.log('做饭')
  resolve('饭熟了')
})
cook
  .then((cook) => {
    console.log(cook)
    return findFater
  })
  .then((findFather) => {
    console.log(findFather)
    return findBrother
  })
  .then((findBrother) => {
    console.log(findBrother)
    console.log('吃饭')
  })
console.log('看电视')

运行结果:
做饭
看电视
饭熟了
小蝌蚪找爸爸
你爸喊你回家吃饭
吃饭

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值