promise入门

221 阅读3分钟
  • promise是什么

主要用于异步计算

可以将异步操作队列化,按照期望的顺序执行

可以在对象之间传递和操作promise,帮助处理队列

  • 异步产生的原因
由于node.js的崛起,无阻塞高并发是node的招牌,为了实现必须依赖异步操作
  • 回调函数的问题
异步操作通常会交给回调函数处理,这时异步回调的四个问题:
  1. 嵌套很深,难以维护
  2. 无法正常使用return和throw
  3. 无法正常检查堆栈信息
  4. 多个回调之间难以建立联系
  • promise详解

new Promise(
	//执行器
	function(resolve, reject) {
		//一段耗时很长的异步操作
		if (true/* 异步操作成功 */){
			resolve(value);//数据处理完成
		} else {
			reject(error);//数据处理出错
		}
	}
).then(function a(){
   //成功 下一步
},function b(){
	//失败 做相应的处理
})


  1. promise是一个代理对象,他和原先要进行的操作无关
  2. 他通过引入一个回调,避免更多的回调

promise三个状态:

pending待定,fulfilled实现,rejected被否决

promise状态改变就会触发.then()里的响应函数

promise已经改变,不会再变

  • 一个简单的实例

const p1 = new Promise(function (resolve, reject) {
  setTimeout(() => resolve('hell'), 2000)
}).then(
	value => {
		console.log(value+'执行完成');
	}
)
console.log('开始')


可以看到当在等待的过程中,还在往下走,然后执行完成延时后再打印出来

  • 对已完成的promise执行then

let promise=new Promise(resolve=>{
	setTimeout(() => {
		console.log('the promise fillfuled');
		resolve('hello world')
	}, 1000);
})
 
promise.then(value=>{
		console.log(value+' then')
	})


promise最为重要的一个特性:在任何地方生成了一个peomise队列之后可以把它作为一个变量传递到其他的地方,不管前面的队列是否完成,都会按照特定的顺序执行。

  • then里不返回promise

new Promise(resolve=>{
	resolve('100')
}).then(value=>{
	console.log(value)
	//return false;
}).then(value=>{
	console.log(value);
})


在promise里如果不返回一个默认的promise实例,就会直接执行下一个环节

  • then的嵌套
不管是then里面嵌套then,还是then并列,都会从上往下执行,所以为了更直观,建议直接把嵌套里的then拿出来。
  • 错误处理

new Promise(resolve=>{
	throw new Error('错误')
}).then(value=>{
	console.log(value)
}).catch(err=>{
	console.log(err);
})


当执行器里抛出错误,就不会执行then,会被catch所捕获

  • 错误和then连用
在所有的队列之后都加上catch以避免错误处理漏掉意想不到的问题
  • promise.all

当所有子promise执行完成之后,promise才算完成,并且返回一个数组,数组里的值是所有的子promise值的集合。

当有一个子promise出错了,promise的错误就是它第一个子promise失败的结果

Promise.all([1,2,3])
.then(all=>{
	console.log(all);
	let p1=new Promise(resolve=>{ //会等待
		setTimeout(()=>{
			resolve('hjdfg')
		},3000);
	});
	return Promise.all([p1]);
})
.then(all=>{
	console.log(all);
	let p1=new Promise(null,reject=>{
		setTimeout(()=>{
      reject('i m p2')
		},1000)
	})
	return Promise.all([p1]);
})
.then(all=>{
	console.log(all)
},err=>{ //错误
	console.log("err:"+err)
})
.catch(err=>{
	console.log("err:"+err)
})