Promise对象---详解

根据阮一峰大神《ES6标准入门(第二版)》,有兴趣可以看一下~

Promise的含义

Promise是异步编程的解决方案,比传统的解决方案-回调事件和函数-更合理和强大。

两个特点

1、对象的状态不受外界影响。Promise对象代表一个异步的操作。有三种状态:Pending进行中,Resovled已完成,Rejected已失败。只有异步操作的结果可以决定当前的状态,任何其他操作都无法改变这个状态。额...这个原理就像是受精卵一样...

2、一旦状态改变,就不会再变,任何时候都可以得到这个结果。状态改变的两种结果:pending→resolved,pending→rejected。状态凝固,并且不会再改变了。再添加回调函数仍旧是这个结果。事件的特点:如果错过,再去监听,得不到结果。

三个缺点

1、无法取消Promise,一旦新建立刻执行,无法中途取消。

2、如果不设置回调函数,内部抛出错误无法反应到外部。

3、当pending状态时,无法得知目前进展那一阶段。

一般,如果事件不断发生,stream模式比部署Promise更好。

基本用法

var variable;
	/**
	 *实例化promise对象
	 *
	 * @param {*} ms
	 * @returns
	 */
	function timeout(ms) {
		return new Promise((resolve,reject)=>{
			setTimeout(resolve,ms,'done');
		});
	  }

	  timeout(100).then((value) => {
		//   执行函数
		variable=value;
		  console.log(value);
		  return variable;
	  });
	  console.log(variable);

Promise构造函数接受一个函数作为参数,resolve和reject,它们是js引擎提供的两个函数,不用自己部署。

resolve:将Promise对象的状态pending→resolve,在异步操作成功时将结果作为参数传出去,reject:是将pending→reject,在异步操作失败时,并并将报出的错误作为参数传出去。

例子:

promise.then((value)=>{
		//success
	},error=>{
		//failure
	});

then方法可以接受两个函数作为参数,第一个回调函数是promise对象的状态变为resolved是调用,第二个函数是在promise对象的状态变为reject时进行调用。

第二个函数是可选的,这两个函数都接受promise对象传出的值作为参数。

Promise的resolve函数参数除了正常的值外,还能是另一个promise的实例。表示异步结果有可能是一个值,也可能是一个异步的操作。

var p1 = new Promise(function (resolve, reject) {setTimeout(() =>reject(new Error('fail')), 3000);});
	var p2 = new Promise(function (resolve, reject) {setTimeout(() =>resolve(p1), 1000);})
	p2.then(result =>console.log(result)).catch(error =>console.log(error));

上面的代码,p1是一个promise,3秒后变为reject,p2的状态在1秒后改变,resolve方法是返回p1,由于p2返回的是另一个promise,所以then后面的语句,都是针对p1的,过了两秒之后,p1变为reject,导致触发catch方法指定的回调函数。

Promise.prototype.then()

then方法里面有resolve和reject调用的函数,当第一个结束后,将数据进行return操作,可以将数据传给第二个then进行调用。

	p2.then(result=>{
		return result;
	}).then(result=>{
		var a=result;
	})

Promise.prototype.catch()

该方法是.then(null,rejection)的别名,用于指定发生错误时回调的函数,

	var promise = new Promise((resolve, reject) => {
		resolve('ok');
		throw new Error('test');
	});
	promise.then(value => console.log(value)).catch(error => console.log(error));
	//处理promise对象和then的错误

then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。

上面的代码抛出的错误在resolve之和,所以catch不会捕获到错误。

promise对象的错误具有冒泡的性质,会一直向后传递,直到捕获发生为止,也就是说catch放在最后,会捕获到前面的错误。

	var someAsync = function () {
		return new Promise((resolve, reject) => resolve(x + 2));
	};

	someAsync().then(() => {
		return someAsyncThing();
	}).catch(error => {
		console.log(error);
		y + 2;
	}).then(() => console.log('carry on-------------')).catch(error => console.log(error));

此处catch中有错误,后面却没有catch进行捕获,所以会发生错误,这就需要进行再添加catch进行错误的捕获,否则catch后的then进不去,在catch中报错。

promise.all()

这个方法是接受一组数组作为参数的,但是参数之间的执行顺序不能明确的划分,只要有一个出现错误,就会将错误进行抛出,让reject进行执行。如果执行完成,需要参数全部只能成功才会进入到resolve。此处在项目中没有用到,就简略的提一下吧。

再后面就是异步操作和Asyn函数了,由于js是单线程的,所以异步编程对js语言来说太重要了,还没有进行深刻的认识,就不和大家瞎比比了。。。。

Promise对象---详解_第1张图片

你可能感兴趣的:(javascript)