es6--promise发起ajax请求
promise所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。感觉跟java的Future类很像啊,有木有!我们可以通过Promise的构造函数来创建Promise对象,并在内部封装一个异步...
promise
所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
感觉跟java的Future类很像啊,有木有!
我们可以通过Promise的构造函数来创建Promise对象,并在内部封装一个异步执行的结果。
语法:
const promise = new Promise(function(resolve, reject) {
// ... 执行异步操作
if (/* 异步操作成功 */){
resolve(value);// 调用resolve,代表Promise将返回成功的结果
} else {
reject(error);// 调用reject,代表Promise会返回失败结果
}
});
这样,在promise中就封装了一段异步执行的结果。
如果我们想要等待异步执行完成,做一些事情,我们可以通过promise的then方法来实现,语法:
promise.then(function(value){
// 异步执行成功后的回调
});
如果想要处理promise异步执行失败的事件,还可以跟上catch:
promise.then(function(value){
// 异步执行成功后的回调
}).catch(function(error){
// 异步执行失败后的回调
})
示例 这段代码可以直接使用链接正常需要自己引入jquery:
<html>
<!--网页头标记-->
<head>
<!-- 网页名 -->
<title>promise测试</title>
<!-- 设置编码字符集根据编码工具的格式变化 meta添加到head标记里面-->
<meta charset="UTF-8">
</head>
<body>
<script type="text/javascript" src="jquery.min.js"></script>
<script>
const promise = new Promise(function (resolve, reject) {
// ... 执行异步操作
$.ajax({
type: "GET",
url: "https://www.easy-mock.com/mock/5bf27535a733fb71407cf664/tensquare_bsl/test",
dataType: "json",
success: function (response) {
//200 为正常 如果要测试失败可以自己调试
if (response.code == 200) {
resolve(response); // 调用resolve,代表Promise将返回成功的结果
} else {
reject(response); // 调用reject,代表Promise会返回失败结果
}
}
})
})
//成功
promise.then(response => {
alert(`成功:${response.message}`)
console.log(`成功:${response.message}`)
//失败
}).catch(response => {
alert(`失败:${response.message}`)
console.log(`失败:${response.message}`)
})
</script>
</body>
</html>
结果:
成功
失败:
上面是异步方式有时候我们会需要同步执行某段代码:
<html>
<!--网页头标记-->
<head>
<!-- 网页名 -->
<title>promise测试</title>
<!-- 设置编码字符集根据编码工具的格式变化 meta添加到head标记里面-->
<meta charset="UTF-8">
</head>
<body>
<script type="text/javascript" src="jquery.min.js"></script>
<script>
const promise = new Promise(function (resolve, reject) {
// ... 执行异步操作
$.ajax({
type: "GET",
url: "https://www.easy-mock.com/mock/5bf27535a733fb71407cf664/tensquare_bsl/test",
dataType: "json",
success: function (response) {
//200 为正常 如果要测试失败可以自己调试
if (response.code == 200) {
resolve(response); // 调用resolve,代表Promise将返回成功的结果
} else {
reject(response); // 调用reject,代表Promise会返回失败结果
}
}
})
})
//成功
// promise.then(response => {
// alert(`成功:${response.message}`)
// console.log(`成功:${response.message}`)
// //失败
// }).catch(response => {
// alert(`失败:${response.message}`)
// console.log(`失败:${response.message}`)
// })
//同步执行上面结果
async function test() {
let result = await promise;
console.log(`同步执行:${result.message}`)
}
test();
</script>
</body>
</html>
ES6提供了Set和Map的数据结构。
Set,本质与数组类似。不同在于Set中只能保存不同元素,如果元素相同会被忽略。跟java很像吧。
构造函数:
// Set构造函数可以接收一个数组或空
let set = new Set();
set.add(1);// [1]
// 接收数组
let set2 = new Set([2,3,4,5,5]);// 得到[2,3,4,5]
普通方法:
set.add(1);// 添加
set.clear();// 清空
set.delete(2);// 删除指定元素
set.has(2); // 判断是否存在
set.keys();// 返回所有key
set.values();// 返回所有值
set.entries();// 返回键值对集合
// 因为set没有键值对,所有其keys、values、entries方法返回值一样的。
set.size; // 元素个数。是属性,不是方法。
map,本质是与Object类似的结构。不同在于,Object强制规定key只能是字符串。而Map结构的key可以是任意对象。即:
-
object是 <string,object>集合
-
map是<object,object>集合
构造函数:
// map接收一个数组,数组中的元素是键值对数组
const map = new Map([
['key1','value1'],
['key2','value2'],
])
// 或者接收一个set
const set = new Set([
['key1','value1'],
['key2','value2'],
])
const map2 = new Map(set)
// 或者其它map
const map3 = new Map(map);
方法:
4.3.8.模块化
4.3.8.1.什么是模块化
模块化就是把代码进行拆分,方便重复利用。类似java中的导包:要使用一个包,必须先导包。
而JS中没有包的概念,换来的是 模块。
模块功能主要由两个命令构成:export
和import
。
-
export
命令用于规定模块的对外接口, -
import
命令用于导入其他模块提供的功能。
4.3.8.2.export
比如我定义一个js文件:hello.js,里面有一个对象:
const util = {
sum(a,b){
return a + b;
}
}
我可以使用export将这个对象导出:
const util = {
sum(a,b){
return a + b;
}
}
export util;
当然,也可以简写为:
export const util = {
sum(a,b){
return a + b;
}
}
export
不仅可以导出对象,一切JS变量都可以导出。比如:基本类型变量、函数、数组、对象。
当要导出多个值时,还可以简写。比如我有一个文件:user.js:
var name = "jack"
var age = 21
export {name,age}
省略名称
上面的导出代码中,都明确指定了导出的变量名,这样其它人在导入使用时就必须准确写出变量名,否则就会出错。
因此js提供了default
关键字,可以对导出的变量名进行省略
例如:
// 无需声明对象的名字
export default {
sum(a,b){
return a + b;
}
}
这样,当使用者导入时,可以任意起名字
import
使用export
命令定义了模块的对外接口以后,其他 JS 文件就可以通过import
命令加载这个模块。
例如我要使用上面导出的util:
// 导入util
import util from 'hello.js'
// 调用util中的属性
util.sum(1,2)
要批量导入前面导出的name和age:
import {name, age} from 'user.js'
console.log(name + " , 今年"+ age +"岁了")
但是上面的代码暂时无法测试,因为浏览器目前还不支持ES6 的导入和导出功能。除非借助于工具,把ES6 的语法进行编译降级到ES5,比如Babel-cli
工具
对象扩展
ES6给Object拓展了许多新的方法,如:
-
keys(obj):获取对象的所有key形成的数组
-
values(obj):获取对象的所有value形成的数组
-
entries(obj):获取对象的所有key和value形成的二维数组。格式:
[[k1,v1],[k2,v2],...]
-
assian(dest, ...src) :将多个src对象的值 拷贝到 dest中(浅拷贝)。
数组扩展
ES6给数组新增了许多方法:
-
find(callback):把数组中的元素逐个传递给函数callback执行,如果返回true,则返回该元素
-
findIndex(callback):与find类似,不过返回的是品牌到的元素的索引
-
includes(element):判断指定元素是否存在
更多推荐
所有评论(0)