ECMAScript6:promise

来自CloudWiki
跳转至: 导航搜索

ES6给出了promise 这一强大的异步编程解决方案。

promise构造函数

一个promise 可以通过promise构造函数来创建,

执行器函数 接收两个参数,分别是resolve函数和reject函数,

异步操作成功时调用resolve函数,失败时调用reject函数

 
const promise = new Promise(function(resolve, reject) {
	// 开启异步操作
  setTimeout(function(){
  	try{
  		let c = 6 / 0 ;
  		// 执行成功调用resolve函数
  		resolve(c);
  	}catch(ex){
  		// 执行失败调用reject函数
  		reject(ex);
  	}
  }, 1000);
});

在promise状态改变后,怎么去根据不同的状态去做相应的处理呢 ?

promise的then方法

它接受两个参数,一个是promise状态变为fulfilled时要调用的函数,

一个是当promise状态变为rejected时要调用的函数。

这两个参数都是可选的。

promise.then(function(<nowiki>在此插入非格式文本value){

// 完成 console.log(value); // 3 },function(err){ // 拒绝 console.error(erro.message); })</nowiki>

promise的catch方法

promise对象还有一个catch方法,用于执行失败后进行处理,

一般then和catch一起使用

promise.then(function(value){
	// 完成
	console.log(value);  // 3
}).catch(function (err){
	// 拒绝
	console.error(err.message);
});

promise的链式调用

链式调用时,可以给后续的promise传递数据。

 
const promise = new Promise((resolve, reject) => {
	// 调用setTimeout模拟异步操作
	setTimeout( ()=> {
		let intArray = new Array(20);
		for(let i=0; i<20; i++){
			intArray[i] = parseInt(Math.random() * 20, 10);
		}
		// 成功后调用resolve
		resolve(intArray);
	},1000);
	// 该代码会立即执行
	console.log("开始生成一个随机数的数组")
});
	
promise.then(value => {
	value.sort((a,b) => a-b);
	return value;
	}).then(value => console.log(value));
 
const promise = new Promise((resolve, reject)=>{
	resolve("Hello Word");
});

promise.then((value) => {
	console.log(value);
	throw new Error("错误");
}).catch(err => console.error(err.message));