Promise

要求多个异步任务顺序执行

function liang(){
    console.log(`亮起泡...`);
    setTimeout(function(){
        console.log(`亮到达终点!`);
    },Math.random()*2*1000+1000);
}
function ran(){
    console.log(`然起泡...`);
    setTimeout(function(){
        console.log(`然到达终点!`);
    },Math.random()*2*1000+1000);
}
liang()
ran()

问题:单纯调用两个异步函数,不能顺序执行,谁先到不知道
解决:回调函数

function liang(next){
    console.log(`亮起泡...`);
    setTimeout(function(){
        console.log(`亮到达终点!`);
        next();
    },Math.random()*2*1000+1000);
}
//调用
liang(function(){ran();})

callback-hell

function ran(next){
    console.log(`然起泡...`);
    setTimeout(function(){
        console.log(`然到达终点!`);
        next();
    },Math.random()*2*1000+1000);
}
//再造两个函数
function dong(next){
    console.log(`东起泡...`);
    setTimeout(function(){
        console.log(`东到达终点!`);
        next();
    },Math.random()*2*1000+1000);
}
function tao(next){
    console.log(`涛起泡...`);
    setTimeout(function(){
        console.log(`涛到达终点!`);
        next();
    },Math.random()*2*1000+1000);
}
//调用
liang(
  function(){
      ran(function(){
          dong(function(){
             tao(function(){
                console.log(`比赛结束`);
              })
          })
      })
   }
)

上面写法回调地狱现象
解决:promise是专门解决回调地狱问题,保证多个异步任务可以顺序执行

function liang(){
   return new Promise(function(resolve){
      console.log(`亮起泡...`);
      setTimeout(function(){
        console.log(`亮到达终点!`);
        resolve();
      },Math.random()*2*1000+1000);
   })
}

function ran(){
    console.log(`然起泡...`);
    setTimeout(function(){
        console.log(`然到达终点!`);
    },Math.random()*2*1000+1000);
}
liang().then(ran);

//改写上面的回调地狱现象


function liang(){
   return new Promise(function(resolve){
      console.log(`亮起泡...`);
      setTimeout(function(){
        console.log(`亮到达终点!`);
        resolve();
      },Math.random()*2*1000+1000);
   })
}

function ran(){
  return new Promise(function(resolve){
      console.log(`然起泡...`);
      setTimeout(function(){
        console.log(`然到达终点!`);
        resolve();
      },Math.random()*2*1000+1000);
   })
}

function dong(){
  return new Promise(function(resolve){
      console.log(`东起泡...`);
      setTimeout(function(){
        console.log(`东到达终点!`);
        resolve();
      },Math.random()*2*1000+1000);
   })
}

function tao(){
  return new Promise(function(resolve){
      console.log(`涛起泡...`);
      setTimeout(function(){
        console.log(`涛到达终点!`);
        resolve();
      },Math.random()*2*1000+1000);
   })
}
liang().then(ran).then(dong).then(tao).then(()=>console.log(`比赛结束`))

前后任务传递参数
在后一项任务的函数上定义形参变量准备接resolve()传下来的实参值

function liang(){
   return new Promise(function(resolve){
      var bang=`接力棒`;
      console.log(`亮拿着${bang}起泡...`);
      setTimeout(function(){
        console.log(`亮拿着${bang}到达终点!`);
        resolve(bang);
      },Math.random()*2*1000+1000);
   })
}


function ran(b){
  return new Promise(function(resolve){
      console.log(`然接着${b}起泡...`);
      setTimeout(function(){
        console.log(`然拿着${b}到达终点!`);
        resolve(b);
      },Math.random()*2*1000+1000);
   })
}

function dong(b){
  return new Promise(function(resolve){
      console.log(`东接着${b}起泡...`);
      setTimeout(function(){
        console.log(`东拿着${b}到达终点!`);
        resolve(b);
      },Math.random()*2*1000+1000);
   })
}

function tao(b){
  return new Promise(function(resolve){
      console.log(`涛接着${b}起泡...`);
      setTimeout(function(){
        console.log(`涛拿着${b}到达终点!`);
        resolve();
      },Math.random()*2*1000+1000);
   })
}
liang().then(ran).then(dong).then(tao).then(()=>console.log(`比赛结束`))

错误处理

function liang(){
   return new Promise(function(resolve,reject){
      var bang=`接力棒`;
      console.log(`亮拿着${bang}起泡...`);
      setTimeout(function(){
        if(Math.random()<0.6){
              console.log(`亮拿着${bang}到达终点!`);
              resolve(bang);         
        }else{
             console.log(`biaji...`);
             reject(`亮摔倒了!`)
        }
      },Math.random()*2*1000+1000);
   })
}


function ran(b){
  return new Promise(function(resolve,reject){
      console.log(`然接着${b}起泡...`);
      setTimeout(function(){
        if(Math.random()<0.6){
             console.log(`然拿着${b}到达终点!`);
             resolve(b);            
        }else{
           console.log(`biaji...`);
           reject(`然摔倒了!`)
        }
      },Math.random()*2*1000+1000);
   })
}

function dong(b){
  return new Promise(function(resolve,reject){
      console.log(`东接着${b}起泡...`);
      setTimeout(function(){
	      if(Math.random()<0.6){
	           console.log(`东拿着${b}到达终点!`);
	           resolve(b);
	        }else{
	           console.log(`biaji...`);
	           reject(`东摔倒了!`)
	        }
      },Math.random()*2*1000+1000);
   })
}

function tao(b){
  return new Promise(function(resolve,reject){
      console.log(`涛接着${b}起泡...`);
      setTimeout(function(){
	      if(Math.random()<0.6){
	        console.log(`涛拿着${b}到达终点!`);
	        resolve();
	      }else{
	         console.log(`biaji...`);
		     reject(`涛摔倒了!`)
	      }
      },Math.random()*2*1000+1000);
   })
}
liang().then(ran).then(dong).then(tao).then(()=>console.log(`比赛结束`)).catch(errMsg=>{console.error(errMsg);console.log("比赛中断")});

如何等待多个任务都执行完,才结束,
如果需要等待的多个异步任务之间没有必然的先后顺,最好让多个任务先异步执行用promise.all

function liang(){
   return new Promise(function(resolve){
      console.log(`亮起泡...`);
      setTimeout(function(){
        console.log(`亮到达终点!`);
        resolve();
      },Math.random()*6000);
   })
}

function ran(){
  return new Promise(function(resolve){
      console.log(`然起泡...`);
      setTimeout(function(){
        console.log(`然到达终点!`);
        resolve();
      },Math.random()*6000);
   })
}

function dong(){
  return new Promise(function(resolve){
      console.log(`东起泡...`);
      setTimeout(function(){
        console.log(`东到达终点!`);
        resolve();
      },Math.random()*6000);
   })
}

function tao(){
  return new Promise(function(resolve){
      console.log(`涛起泡...`);
      setTimeout(function(){
        console.log(`涛到达终点!`);
        resolve();
      },Math.random()*6000);
   })
}
console.log(`比赛开始...pia!`)
Promise.all([
    liang(),
    ran(),
    dong(),
    tao()
]).then(()=>{
     console.log(`比赛结束!`)
})
//传参
function liang(){
   return new Promise(function(resolve){
      console.log(`亮起泡...`);
      setTimeout(function(){
        console.log(`亮到达终点!`);
        resolve(`亮的接力棒`);
      },Math.random()*6000);
   })
}

function ran(){
  return new Promise(function(resolve){
      console.log(`然起泡...`);
      setTimeout(function(){
        console.log(`然到达终点!`);
        resolve(`然的接力棒`);
      },Math.random()*6000);
   })
}

function dong(){
  return new Promise(function(resolve){
      console.log(`东起泡...`);
      setTimeout(function(){
        console.log(`东到达终点!`);
        resolve(`东的接力棒`);
      },Math.random()*6000);
   })
}

function tao(){
  return new Promise(function(resolve){
      console.log(`涛起泡...`);
      setTimeout(function(){
        console.log(`涛到达终点!`);
        resolve(`涛的接力棒`);
      },Math.random()*6000);
   })
}
console.log(`比赛开始...pia!`)
Promise.all([
    liang(),
    ran(),
    dong(),
    tao()
]).then((result)=>{
     console.log(`比赛结束!`);
     console.log(result);
})

ES7中promise的简写

function liang(){
   return new Promise(function(resolve){
      console.log(`亮起泡...`);
      setTimeout(function(){
        console.log(`亮到达终点!`);
        resolve();
      },Math.random()*6000);
   })
}

function ran(){
  return new Promise(function(resolve){
      console.log(`然起泡...`);
      setTimeout(function(){
        console.log(`然到达终点!`);
        resolve();
      },Math.random()*6000);
   })
}

function dong(){
  return new Promise(function(resolve){
      console.log(`东起泡...`);
      setTimeout(function(){
        console.log(`东到达终点!`);
        resolve();
      },Math.random()*6000);
   })
}

function tao(){
  return new Promise(function(resolve){
      console.log(`涛起泡...`);
      setTimeout(function(){
        console.log(`涛到达终点!`);
        resolve();
      },Math.random()*6000);
   })
}
(async function(){
   console.log(`比赛开始!`);
   await liang();
   await ran();
   await dong();
   await tao();
   console.log(`比赛结束!`);
})()
//传值
function liang(){
   return new Promise(function(resolve,reject){
      var bang=`接力棒`;
      console.log(`亮拿着${bang}起泡...`);
      setTimeout(function(){
        if(Math.random()<0.6){
              console.log(`亮拿着${bang}到达终点!`);
              resolve(bang);         
        }else{
             console.log(`biaji...`);
             reject(`亮摔倒了!`)
        }
      },Math.random()*2*1000+1000);
   })
}


function ran(b){
  return new Promise(function(resolve,reject){
      console.log(`然接着${b}起泡...`);
      setTimeout(function(){
        if(Math.random()<0.6){
             console.log(`然拿着${b}到达终点!`);
             resolve(b);            
        }else{
           console.log(`biaji...`);
           reject(`然摔倒了!`)
        }
      },Math.random()*2*1000+1000);
   })
}

function dong(b){
  return new Promise(function(resolve,reject){
      console.log(`东接着${b}起泡...`);
      setTimeout(function(){
	      if(Math.random()<0.6){
	           console.log(`东拿着${b}到达终点!`);
	           resolve(b);
	        }else{
	           console.log(`biaji...`);
	           reject(`东摔倒了!`)
	        }
      },Math.random()*2*1000+1000);
   })
}

function tao(b){
  return new Promise(function(resolve,reject){
      console.log(`涛接着${b}起泡...`);
      setTimeout(function(){
	      if(Math.random()<0.6){
	        console.log(`涛拿着${b}到达终点!`);
	        resolve();
	      }else{
	         console.log(`biaji...`);
		     reject(`涛摔倒了!`)
	      }
      },Math.random()*2*1000+1000);
   })
}
(async function(){
    try{
       console.log(`比赛开始!`)
       var b=await liang();
       b=await ran(b);
       b=await dong(b);
       await  tao(b);
       console.log(`比赛结束!`);
    }catch(errMsg){
         console.log(errMsg);
         console.log("比赛中断!");
    }
})()

promise.all ES7简写

function liang(){
   return new Promise(function(resolve){
      console.log(`亮起泡...`);
      setTimeout(function(){
        console.log(`亮到达终点!`);
        resolve(`亮的接力棒`);
      },Math.random()*6000);
   })
}

function ran(){
  return new Promise(function(resolve){
      console.log(`然起泡...`);
      setTimeout(function(){
        console.log(`然到达终点!`);
        resolve(`然的接力棒`);
      },Math.random()*6000);
   })
}

function dong(){
  return new Promise(function(resolve){
      console.log(`东起泡...`);
      setTimeout(function(){
        console.log(`东到达终点!`);
        resolve(`东的接力棒`);
      },Math.random()*6000);
   })
}

function tao(){
  return new Promise(function(resolve){
      console.log(`涛起泡...`);
      setTimeout(function(){
        console.log(`涛到达终点!`);
        resolve(`涛的接力棒`);
      },Math.random()*6000);
   })
}
(async function(){
         console.log(`比赛开始...pia!`)
		var result=await Promise.all([
		    liang(),
		    ran(),
		    dong(),
		    tao()
		])
		 console.log(`比赛结束!`);
		 console.log(result);
})()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值