ES6,promise发起ajax请求

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中没有包的概念,换来的是 模块。

模块功能主要由两个命令构成:exportimport

  • 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):判断指定元素是否存在

猜你喜欢

转载自blog.csdn.net/adminBfl/article/details/84313753
今日推荐