Promise

一,Promise使用方式

Promise是es6中增加的构造函数(类)之一 ,还有proxy , map , get

proxy代理 ?

使用方式

  1. promise 接收一个函数作为参数 , 通常我们会在该函数内发送异步请求
    2.该函数有两个参数 , resolve , reject ,这两个也是函数
    resolve执行时, 会将Promise实例的状态修改为resolved
    reject 执行时, 会将Promise实例的状态修改为rejected
    3.Promise的实例,有then()方法, 该方法可以接收两个函数作为参数,第一个函数表示成功时(resolved)执行的函数,参数是resolve执行时传递的参数,只能传递一个参数

第二个函数表示失败(rejected)时,执行的函数 ,参数是reject执行时传递的参数,也只能传递一个参数 。
4.then方法可以连续打点调用,
当Promise实例为同一个时,第一个then会根据Promise的状态变化而决定执行第一个函数还是第二个函数 , 后续的then只有第一个参数函数生效,第二个写了也没用。

var p = new Promise(function(resolve,reject){
	//发送ajax要卸载这里
	Ajax.get("./php/a.php","",function(data){
		if(!data.error){
			//以前我们把具体的业务逻辑写在回调函数的if语句块中
			//现在我们不写业务逻辑,而是调用resolve 或者 reject
			console.log(data)
			resolve(data.msg);
		}else{
			reject();
		}
	})

});

//p这个对象有个then()方法, 接受两个函数作为参数
p.then(function(msg){
	 console.log("成功")
	 console.log(msg)
},function(){
	console.log("失败")
})

以前我们在回调函数中写业务逻辑, 现在我们在函数中成功了就执行resolve(), 失败了就执行reject(). 然后把具体对应的代码写到 then () 中 。resolve 和 reject 都可以传参数 。

p.then() 调用完了返回的是p对象 ,因此可以继续 .then() 。
这个函数执行完了还是他自己。

二,Promise连续调用

//定义一个promise
p.then(function(msg){
	console.log("成功")
	var p1 = new Promise(function(resolve,reject){
		Ajax.get("php.php","b=2",function(data){
			if(!data.error){
				resolve(data.msg)
			}else{
				reject(data.msg)
			}
		})
	})
	//返回promise实例
	return p1;
},function(){
	console.log("失败")
})

//第二个then监听的就是p1的状态变化

.then(function(data){
	console.log(data)
})
.catch(function(){
// 谁失败处理谁
})

三,Promise的静态方法

之前我们是先发送一个请求,等请求发送回来之后再发送另一个
现在希望同时发送两个请求,等他们都回来之后再做事情

于是 Promise 提供了静态方法 all (构造函数调用的方法叫静态方法)

Promise.all(arr)
该方法接受一个数组为参数, 数组中的每一个成员都是Promise实例。
该方法的作用是 : 同时监听多个promise实例的状态变化,返回值是一个新的promise实例
如果被监听的promise实例中有任何一个失败了, all返回的promise实例的状态变为rejected(失败) , 被监听的promise实例都resolved了, all返回的Promise实例状态变为resolved了 (成功)

Promise.all([])

function sendPromise1(){
	return new Promise(function(resolve,reject){{
		Ajax.get("a.php","",function(data){
			if(!data.error){
				resolve(data.msg)
			}else{
				reject(data.msg)
			}
		})
	})
}

function sendPromise2(){
	return new Promise(function(resolve,reject){{
		Ajax.get("b.php","",function(data){
			if(!data.error){
				resolve(data.msg)
			}else{
				reject(data.msg)
			}
		})
	})
}



let p1 = sendPromise1();
let p2 = sendPromise2();
//以下一条代码的含义是, 让p监听p1 和 p2
let p = Promise.all([p1,p2]);
p.then(function(arr){
//成功时,唯一的参数是数组,数组的每一项是all接收的数组的每一项对应的传递的数据
consolo.log("两个都成功")

})
.catch(msg){
	console.log(msg) //失败时,唯一的参数是失败的第一个reject传递的数据
}

Promise.race

// Promise.race
//该方法接受一个数组作为参数,每一个成员应当是Promise的实例
//该方法的作用,返回一个Promise的实例,该实例的状态跟随数组中第一个发生状态变化的Promise实例
let p = Promise.race([p1,p2])
p.then(function(msg){

})
.catch(function(msg){

})

Promise.resolve

该方法接受3种可能性的参数

  1. 非Promise 比如数字,字符串,布尔值等
  2. Promise实例
  3. thenable对象

返回值是一个Promise实例 如果是非Promise作为参数 ,则Promise实例的状态为resolved ,并且接收到的值是该参数

let p = Promise.resolve(1);
p.then(function(msg){
	console.log(msg) //1
})

如果是Promise实例作为参数 ,则跟随它的状态

let p = Promise.resolve(sendPromise());
p.then(function(data){
	console.log("success",data)
})

.catch(function(msg){
	console.log("failed",msg)
})

如果是thenable 对象

let p = Promise.resolve({
then:function(resolve,reject){
	resolve();
}
})
p.then(function(){
	console.log("成功")
})
.catch(function(){
	console.log("失败")
})

Promise.reject()

返回一个状态为rejected的Promise实例, 参数是什么都可以。参数一般是一个描述失败原因的字符串。

let p = Promise.reject("失败了,也不知道为什么")

p.then(function(){
 // 这个then写不写没有用
})
.catch(function(a){
	console.log(a) //失败了,也不知道为什么
})
### Promise 在异步编程中的角色 Promise 是一种用于处理异步操作的解决方案,它在语法上是一个 ES6 的原生对象,代表了未来将要发生的事件,用来传递异步操作的消息。从本质上讲,Promise 是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。 Promise 提供了一个统一的 API,使得各种异步操作可以使用相同的方法进行处理。这意味着无论异步操作的结果是成功还是失败,都可以通过 Promise 的 API 来处理这些结果。 Promise 对象有两个主要的状态变化:从 pending(等待)变为 fulfilled(已成功)或 rejected(已失败)。一旦状态改变,就不会再变,这保证了 Promise 的结果是不可逆的。 下面是一个简单的 Promise 使用示例: ```javascript var p1 = new Promise(function(resolve, reject) { // 异步操作 resolve('OK'); // 或者 reject('Error'); }); p1.then(function(rs) { // 如果 p1 的状态变为 resolved,则执行此函数,并且 rs 会接收到 'OK' }).catch(function(rs) { // 如果 p1 的状态变为 rejected,则执行此函数,并且 rs 会接收到 'Error' }).finally(function() { // 不论 p1 的状态如何,finally 中的函数一定会执行 }); ``` 此外,Promise 还提供了 `Promise.all()` 方法,该方法接收一个 Promise 数组,并返回一个新的 Promise。只有当数组中的所有 Promise 都成功完成时,这个新的 Promise 才会成功,并且其结果是一个包含所有 Promise 结果的数组。 ```javascript let p1 = new Promise((resolve, reject) => { resolve('OK'); }); let p2 = Promise.reject('error'); // 修改为 reject 以展示错误处理 let p3 = Promise.resolve('Oh Year!'); const result = Promise.all([p1, p2, p3]); console.log(result); ``` 在这个例子中,由于 p2 被设置为 rejected,所以整个 Promise.all 的结果也会是 rejected。如果希望即使有一个失败也要继续执行其他 Promise,可以考虑使用 `Promise.allSettled()` 方法。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值