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是跨域访问技巧