JavaScript 中的解决异步问题Promise

  1. 什么是promise?
    话不多说,我们直接来看下面的案例
setTimeout(function(){
	console.log("第一个");
},3000)
setTimeout(function(){
	console.log("第二个");
},2000)
setTimeout(function(){
	console.log("第三个");
},1000)

//最后会输出 第三个、第二个、第一个

我们会发现我们的定时器从下往上进行执行了,这算是由于我们的js运行机制是单线程

咱们来解决异步:第一种:回调函数

//接力跑:第一个人开枪就跑,2s后,第二个人开始跑,再2s后,第三个人开始跑,2s后,比赛结束
function one(next){
	console.log("开始比赛")
	console.log("one start run")
	setTimeout(function(){
		next()
	},2000)
}
function two(next){
	console.log("one end")
	console.log("two start run")
	setTimeout(function(){
		next()
	},2000)
}
function three(){
	console.log("two end")
	console.log("three start run")
	setTimeout(function(){
		console.log("比赛结束")
	},2000)
}
one(function(){
	two(function(){
		three()
	})
})

以上便是 回调地狱 (callback hell)

第二种:promise
promis的实例

//通过new创建promise的实例化对象
//在promise的传递参数中,有两个参数
//resolve 当resolve 执行成功后,会找到then中的第一个参数
//reject 当reject 执行成功后,会找到then中的第二个参数
var pro = new Promise(resolve,reject)=>{
	setTimeout(function(){
		if(false){
			resolve("我是陈小玲玲")
		}else{
			reject("我是大镁铝")
		}
	},1000)
})
//resolve就是我们程序成功后调用的方法
//then里面的第一个参数就是我们成功后要调用的函数
//reject就是我们程序失败后调用的方法
//then里面的第二个参数就是我们失败后要调用的函数
pro.then(function(data){
	console.log("ok");
	console.log(data)
},function(err){
	console.log("no");
	console.log(err)
})

用then和catch//一般习惯用then收成功 用catch收失败

var pro = new Promise(resolve,reject)=>{
	setTimeout(function(){
		if(false){
			resolve("我是陈小玲玲")
		}else{
			reject("我是大镁铝")
		}
	},1000)
})
pro.then(function(data){
	console.log("ok");
	console.log(data)
}.catch(err){
	console.log("no");
	console.log(err)
}))

案例:

function one(){
	return new Promise(
		function(next){
		console.log("开始比赛")
		console.log("one start run")
		setTimeout(function(){
			next()
		},2000)
	})
}

function two(){
	return new Promise(
		function(next){
		console.log("one end")
		console.log("two start run")
		setTimeout(function(){
			next()
		},2000)
	})
}

function three(){
	return new Promise(
		function(next){
		console.log("two end")
		console.log("three start run")
		setTimeout(function(){
			console.log("three end")
			console.log("比赛结束")
		},2000)
	})
}
one().then(two).then(three)

不知道大家看懂了没有 用promise就是让他按照顺序向下执行 不会存在异步执行

  • 前后两个异步任务进行传参
function f1(){
      return new Promise(function(){
        var dao="到";
        console.log(`陈小玲玲说${dao}`);
        //当陈小玲玲答完之后,陈大玲玲答到
        setTimeout(() => {
          f2(dao)
        }, 3000);
      })
    }
    function f2(say){
      console.log(`陈大玲玲说${say}`)
    }
    f1().then(f2)
}
  • promise.all 方法

等待最后一个执行完成后才输出

var p1 = new Promise((resovle,reject)=>{
        setTimeout(() => {
          resovle("我是p1")
        }, 2000);
      })
      var p2 = new Promise((resovle,reject)=>{
        setTimeout(() => {
          resovle("我是p2")
        }, 3000);
      })
      var p3 = new Promise((resovle,reject)=>{
        setTimeout(() => {
          resovle("我是p3")
        }, 1000);
      })
      promise.all([p1,p2,p3]).then(function(data){
        console.log(data)
      })
      //输出[“我是p1”,“我是p2”,“我是p3”]
      //只有当最慢(后)的那个执行完成之后,才会执行all 然后执行then 执行输出
  • promise.race 方法

只要有一个执行了就立即返回

 var p1 = new Promise((resovle,reject)=>{
        setTimeout(() => {
          resovle("我是p1")
        }, 2000);
      })
      var p2 = new Promise((resovle,reject)=>{
        setTimeout(() => {
          resovle("我是p2")
        }, 3000);
      })
      var p3 = new Promise((resovle,reject)=>{
        setTimeout(() => {
          resovle("我是p3")
        }, 1000);
      })
      promise.race([p1,p2,p3]).then(function(data){
        console.log(data)
      })
      //输出:我是p3
  • promise的参数其实就是一个函数,函数由两个回调函数resovle,reject
  • promise的三个状态:pending(挂起/等待)、fulfilled(成功)、rejected(失败)
  • 三个状态的切换:执行new promise()时,异步任务执行完成之前,promise对象处于pending状态
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值