js Promise+Jsonp跨域访问相关概念及案例

Promise

        概念:promise是一个对象,promise里面保存着一个未来才会结束的事件的结果,它可以获取异步操作的消息,并且promise提供了统一的api,各种异步操作都可以用同样的方法进行处理。

        写法:(通常用来操作请求响应事件)

        注意:promise需要放在函数体内,promise需要作为函数的返回值

<script type="text/javascript">
	function fun() {
		let p = new Promise(function(success, reject) {
			if (2 > 1) {
				success()
			} else {
				reject()
			}
		})
		return p;
	}

	function s() {
		console.log("成功");
	}

	function r() {
		console.log("失败");
	}
	fun().then(s, r);
</script>

then方法

        then(参数1,参数2),参数是两个回调函数,是实参,第一个参数是成功的方法,第二是是失败的方法,promise执行时成功则调用成功方法,失败则调用失败方法

then方法操作ajax:

<script type="text/javascript">
	function ajax(type, url, data, isA) {
		type = type.toLowerCase();
		let xhr = new XMLHttpRequest();
		if (type == "get") {
			let urlurl = url;
			if (data != "") {
				urlurl += "?" + data;
			}
			xhr.open(type, urlurl, isA);
			xhr.send();
		} else {
			xhr.open(type, url, isA);
			xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			xhr.send(data)
		}
		let p = new Promise(function(success, reject) {
			xhr.onreadystatechange = function() {
				if (xhr.status == 200 && xhr.readyState == 4) {
					success(xhr.responseText);
				} else if (xhr.readyState == 4) {
					reject();
				}
			}
		});
		return p;
	}

	function fun(res) {
		console.log(res);
	}

	function fun1() {
		console.log("响应失败")
	}
	ajax("get", "adadfs.php", "name=老王&id=12", true).then(fun, fun1);
</script>

all方法

        all处理多个请求,等待所有请求完成后,同时返回所有请求结果,并将结果放置在一个数组中,如果多个请求中有一个执行了失败的方法,则直接返回失败

<script type="text/javascript">
	let p1 = new Promise(function(success, reject) {
		setTimeout(function() {
			success("p1")
		}, 1000);
	})
	let p2 = new Promise(function(success, reject) {
		setTimeout(function() {
			success("p2")
			// reject();
		}, 2000);
	})
	let p3 = new Promise(function(success, reject) {
		setTimeout(function() {
			success("p3")
		}, 3000);
	})

	function fun(res) {
		console.log(res);
	}

	function fun1() {
		console.log("失败")
	}
	Promise.all([p1, p2, p3]).then(fun, fun1)
</script>

结果:

        ['p1', 'p2', 'p3'] 

race方法

        哪个响应快就执行谁,无论成功失败与否,找最快(结果不是数组)

<script type="text/javascript">
	let p1 = new Promise(function(success, reject) {
		setTimeout(function() {
			success("p1")
		}, 1000);
	})
	let p2 = new Promise(function(success, reject) {
		setTimeout(function() {
			success("p2")
			// reject();
		}, 2000);
	})
	let p3 = new Promise(function(success, reject) {
		setTimeout(function() {
			success("p3")
		}, 3000);
	})

	function fun(res) {
		console.log(res);
	}

	function fun1() {
		console.log("失败")
	}
	Promise.race([p1, p2, p3]).then(fun, fun1)
</script>

结果是

        p1


Jsonp

        由于浏览器的同源策略,ajax不支持跨域访问,由此出现了jsonp跨域技术

        同源策略:同htttp协议,同地址,同端口

        概念:Jsonp本质是利用src属性可以跨域的思路实现跨域,是一种跨域的技巧

        思路:

  •  前端定义函数,设计功能
  •  同时通过script标签的src属性引入后端文件,并发送请求参数
  •  后端接收请求参数并模拟函数调用,通过参数位置传递返回数据

接口

        概念:接口是前后端交互的方式,由后端服务器的地址及相关请求参数组合而成

        接口三要素:接口地址、请求参数、返回的数据格式

ajax和jsnop的关系?

  •         jsnop不是ajax实现跨域访问的技术,它们是相互独立的两种技术
  •         jsonp只是一种跨域的技巧
  •         jsonp没有创建可扩展性超文本传输请求对象
  •         jsonp只支持get

jsonp和json的关系?

  •         毫无关系
  •         json是数据的格式
  •         jsonp是跨域访问技巧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值