ES6的简单介绍(第三部分)

五 异步编程

5.5 回调地狱

        回调地狱这个词听起来就非常的高大上,在接触Promise之前,必须要懂得什么是回调地狱,以及为什么会产生回调地狱?

        先来看看概念:当一个回调函数嵌套一个回调函数的时候就会出现一个嵌套结构,当嵌套的多了就会出现回调地狱的情况。

        根据前面我们可以得出一个结论:存在异步任务的代码,不能保证能按照顺序执行,那如果我们非要代码顺序执行呢?

举个例子:让四个回调函数打印骆宾王的《咏鹅》,咱们必须要这样操作,才能保证顺序正确:

setTimeout(function () {
   setTimeout(function () {
      setTimeout(function () {
         setTimeout(function () {
            console.log("红掌拨清波")
         }, 1000)
         console.log("白毛浮绿水")
      }, 2000)
      console.log("曲项向天歌")
   }, 3000)
   console.log("鹅鹅鹅")
}, 4000)

        可以看到,代码中的回调函数套回调函数,居然套了4层,这种回调函数中嵌套回调函数的情况就叫做回调地狱

        总结一下,回调地狱就是为实现代码顺序执行而出现的一种操作,它会造成我们的代码可读性非常差,后期不好维护。

那该如何解决回调地狱呢?

两种方式

1. 使用ES6引入的promise
2. async/await

5.6 promise的应用

        Promise是js中的一个原生对象(也可以理解为一个类或者一个构造函数),是一种异步编程的解决方案,可以替换掉传统的回调函数解决方案

        Promise是一种对异步操作的封装,表示一个操作现在可能还没有完成,但将来会完成,并提供了成功或失败时要执行的操作。

Promise: ES6引入的一个新的概念(可以理解为是一个类,或者是一个构造函数)
        引入的目的主要是解决回调地狱的写法

        异步编程想要做到类似于同步变成的顺序执行,才会涉及到回调地狱

5.6.1 Promise的三种状态

Promise(承诺)的状态:   回调函数执行:从开始到结束。
pending: 等待状态:  承诺的这件事没有结果(结果只有两种情况,要么成功,要么失败),也可以理解为对象刚刚初始化完毕时的状态
fulfilled: 完成,成功状态:  承诺的这件事得到满意的结果。
rejected: 失败,拒绝状态:  承诺的这件事得到不满意的结果。比如类似ajax发送请求,结果收到了404,500这类的状态码

5.6.2 Promise的参数

        Promise构造函数的参数,需要我们传入一个函数,我们需要处理的异步任务就是书写在该函数体内。传入的这个函数,要求必须要有两个参数,第一个参数是异步任务执行成功时的回调函数,第二个参数是异步任务执行失败时的回调函数,正常来说,参数名叫什么都无所谓,但是咱们尽量做到见名知意嘛,所以规范中命名为resolve(解决的含义),reject(拒绝)异步任务执行成功时调用resolve函数返回结果,反之调用reject。

Promise构造函数的参数:
        1.参数是一个回调函数。(参数1,参数2)=>{......}
        2.回调函数里的第一个参数是一个函数,表示成功状态调用的函数,因此参数名可以做到见名知意,叫resolve(解决的含义)
        3.回调函数里的第二个参数也是一个函数,表示失败、拒绝状态调用的函数,因此参数名可以做到见名知意,叫reject(拒绝的含义) 

let p = new Promise( (resolve,reject)=>{
//     使用伪代码来模拟开启的一部编程的任务是否成功执行,或者是失败执行
    /*
        随机数为0~70: 表示任务执行成功
        随机数为71~100: 表示任务执行失败
     */
    let num1 = Math.round(Math.random()*100);
    console.log(num1);
    if (num1<=70){
        resolve("任务1执行成功");
    }else{
        reject("任务1执行失败了");
    }
});

 5.6.3 常用API

  • then()

Promise对象的then方法用来接收处理成功时响应的数据。

then(onfulfilled,onrejected): Promise对象调用该方法
        1. 第一个参数onfulfilled: 用于给Promise的回调函数(参数)的第一个参数resolve赋值,赋的值是一个函数
        函数的样子: (data)=>{......}  :任务执行的结果作为参数传递给data
        2. 第二个参数onrejected: 用于给Promise的回调函数的第二个参数reject赋值,赋的值也是一个函数。
        函数的样子: (reason)=>{......}  :任务执行失败的结果作为参数传递给reason
        作用:任务失败时,执行逻辑的封装。 可以代替catch。
        应用场景:每个人物的失败都像单独处理,可以用第二个参数。 

  •  catch()

catch方法用来接收处理失败时相应的数据

 catch(onrejected)方法:  任务失败时执行该方法,Promise对象调用该方法
        1.参数只有一个onrejected:也是一个函数,用于给Promise的回调函数(参数)的第二个参数reject赋值,赋的值也是一个函数。
        函数的样子: (reason)=>{......}
        作用:所有的任务在失败时想要统一处理时,使用catch。

    Promise的链式调用:
        p.then().then().then()...
        注意: then()方法是Promise对象的,因此,想要链式调用then方法,那么前一个then必须返回一个新的Promise对象

演示代码:

let p = new Promise( (resolve,reject)=>{
//     使用伪代码来模拟开启的一部编程的任务是否成功执行,或者是失败执行
    /*
        随机数为0~70: 表示任务执行成功
        随机数为71~100: 表示任务执行失败
     */
    let num1 = Math.round(Math.random()*100);
    console.log(num1);
    if (num1<=70){
        resolve("任务1执行成功");
    }else{
        reject("任务1执行失败了");
    }
});

// let f1 = (data)=>{
//     console.log("onfulfilled: "+data);
// }
// let f2 = (data)=>{
//     console.log("onrejected: "+data);
// }
// p.then(f1,f2);
p.then((data)=>{
    console.log("onfulfilled: "+data);
    //第二个任务: 必须在任务1成功执行后,执行
    return new Promise((resolve,reject)=>{
        let num2 = Math.round(Math.random()*100)+100;
        console.log(num2);
        if (num2<=170){
            resolve("任务2执行成功");
        }else{
            reject("任务2执行失败了");
        }
    })
},(reason)=>{
    console.log("失败原因1: "+reason);
    return new Promise((resolve,reject)=>{
        let num2 = Math.round(Math.random()*100)+100;
        console.log(num2);
        if (num2<=170){
            resolve("任务2执行成功");
        }else{
            reject("任务2执行失败了");
        }
    })
}).then((data)=>{
    console.log("第二个任务: "+data);
},(reason)=>{
    console.log("失败原因2: "+reason);
})
//     .catch((reason)=>{
//     console.log("失败原因: "+reason);
// })
//     .catch((reason)=>{
//     console.log("onrejected: "+reason);
// })

 Promise完成异步的顺序执行代码

//
// let p =new Promise((resolve,reject)=>{
//     resolve("鹅鹅鹅");
// })
//
// p.then((value)=>{
//     console.log(value);
//     return new Promise((resolve,reject)=>{
//         resolve("曲项向天歌");
//     })
// }).then((value)=>{
//     console.log(value);
//     return new Promise((resolve,reject)=>{
//         resolve("白毛浮绿水");
//     })
// }).then((value)=>{
//     console.log(value);
//     return new Promise((resolve,reject)=>{
//         resolve("红掌拨清波");
//     })
// }).then((value)=>{
//     console.log(value);
// })




let p1=new Promise((resolve,reject)=>{
    let num =Math.round(Math.random()*50);
    if (num<=30){
        resolve("鹅鹅鹅");
    }else{
        reject("锄禾日当午");
    }
})

p1.then((data)=>{
    console.log(data)
    return new Promise((resolve,reject)=>{
        let num2 =Math.round(Math.random()*50);
        if (num2<=30){
            resolve("曲项向天歌");
        }else{
            reject("汗滴禾下土");
        }
    })
},(value)=>{
    console.log(value);
    return new Promise((resolve,reject)=>{
        let num2 =Math.round(Math.random()*50);
        if (num2<=30){
            resolve("曲项向天歌");
        }else{
            reject("汗滴禾下土");
        }
    })
}).then((data)=>{
    console.log(data);
    return new Promise((resolve,reject)=>{
        let num2 =Math.round(Math.random()*50);
        if (num2<=30){
            resolve("白毛浮绿水");
        }else{
            reject("谁知盘中餐");
        }
    })
},(value)=>{
    console.log(value);
    return new Promise((resolve,reject)=>{
        let num2 =Math.round(Math.random()*50);
        if (num2<=30){
            resolve("白毛浮绿水");
        }else{
            reject("谁知盘中餐");
        }
    })
}).then((data)=>{
    console.log(data);
    return new Promise((resolve,reject)=>{
        let num2 =Math.round(Math.random()*50);
        if (num2<=30){
            resolve("红掌拨清波");
        }else{
            reject("粒粒皆辛苦");
        }
    })
},(value)=>{
    console.log(value);
    return new Promise((resolve,reject)=>{
        let num2 =Math.round(Math.random()*50);
        if (num2<=30){
            resolve("红掌拨清波");
        }else{
            reject("粒粒皆辛苦");
        }
    })
}).then((data)=>{
    console.log(data);
},(value)=>{
    console.log(value);
})

5.7 Fetch

Fetch: 是一个基于Promise的API,可以发送HTTP请求

第一种:发送get请求
        fetch(url).then((response)=>{...})
        解析:

        1.url: 请求路径,get请求需要将请求参数拼接到url上。
        2.第一个then里的匿名函数是用于处理请求成功后服务器响应的数据,形参resopnse是整个想要对象的封装,里面含有很多键值对的信息
        比如: type,url,status,redirected,ok, 已经服务端绑定的数据。
        3.如果想要获取服务端发送过来的数据,
                需要 return 响应对象上的json()  实际上返回的是一个新的Promise
        4.因此,如果想要继续处理数据,那么需要继续调用then方法。
        5. 如果处理的是异常信息,可以使用catch

演示代码:

let btn1 = document.querySelector("#btn1");
    // alert(btn1.nodeName);
    btn1.addEventListener("click", function (){
        fetch("checkLogin.lr?username=zhangsan").then((data)=>{
            console.log(data);
            return data.json();
        }).then((data)=>{
            console.log(data);
            // console.log(data.error_msg);
            document.querySelector("#s1").innerText = data.error_msg;
        })
    })

 第二种:发送post请求
        1.格式: fetch(url,{method:"post",body:"请求参数"})
        2.解析: url: 请求路径
                {}用于指定其他的参数
                method:请求方式,默认为get
                body:用于指定请求参数,使用对象类型的写法。还需要使用URLSearchParams类型进行包装
        如果method制定了get请求,那么就不需要body属性,而是将请求参数拼接到url上

演示代码 

 let btn2 = document.querySelector("#btn2");
    // alert(btn1.nodeName);
    btn2.addEventListener("click", function (){
        fetch("checkLogin.lr",
            {method:"post",
            headers:{'content-type':'application/x-www-form-urlencoded'},
            body:"username=zhangsan"
            }).then((data)=>{
            console.log(data)
            return data.json();
        }).then((jsonStr)=>{
            console.log(jsonStr.error_msg);
        })
    })

 第三种: 发送post请求,并且发送json格式的数据

演示代码 

let btn3 = document.querySelector("#btn3");
    let obj = {username:"lisi"};
    // alert(btn1.nodeName);
    btn3.addEventListener("click", function (){
        fetch("checkLogin.lr", {
                method:"post",
                // headers:{'content-type':'application/x-www-form-urlencoded'},
                body:JSON.stringify(obj)
            }).then((data)=>{
            console.log(data)
            return data.json();
        }).then((jsonStr)=>{
            console.log(jsonStr.error_msg);
        })
    })

5.8 Async/Await

        Async/await建立在Promises之上语法糖使得异步代码的编写和理解更接近传统的同步代码风格。(使用同步的方式编写异步代码)

5.8.1 Async关键字

声明函数时,在前面添加Async关键字,表示该函数为一个异步任务,不会阻塞后面函数的执行。

async function fn(){
   return '任务1';
}
console.log(fn());   // Promise{fulfilled: "任务1"}

        打印可以看到async函数返回数据时自动封装为一个Promise对象。

        和Promise对象一样,处理异步任务时也可以按照成功和失败来返回不同的数据,处理成功时用then方法来接收,失败时用catch方法来接收数据

虽然Promise可以解决回调地狱的问题,但是Promise变成充斥着大量的then函数。
        因此可以使用Async/Await来简化Promise的异步编程。
        Async/Await是建立在Promise之上的一个语法糖,可以使用同步代码的风格实现异步编程。

        Async: 异步的意思, 用法简单, 只需要在定义的函数前,添加async关键字即可。
        1. async声明的函数,会隐式返回一个Promise对象
        2. async声明的函数,还是使用then或者catch来调用
        3. 函数中如果正确使用return关键字进行了数据的返回,那么Promise的状态就是fulfilled。
        如果函数中的代码抛出了异常,那么Promise的状态就是rejected。

        4. async修改的函数,本质上是Promise,调用时还是异步代码,并不会阻塞后续的代码运行。
        5. 在普通函数前添加async关键字,等价于在普通函数中return 一个Promise对象

async function f1(){
    // console.log("任务一");
    try{
        return "任务一";
    }catch (e){
        throw new Error("任务一出错了")
    }
}
// function f1(){
//     return new Promise((resolve,reject)=>{
//         try{
//             //......省略大量代码
//             resolve("任务一")
//         }catch (e){
//             reject("任务一出错了")
//         }finally {
//             //释放资源
//         }
//
//     })
// }

f1().then((value)=>{
    console.log(value);
},(reason)=>{
    console.log(reason);
})
console.log("---我是主线程代码---")

5.8.2 Await关键字

  • await关键字只能在使用async定义的函数中使用

  • await后面可以直接跟一个 Promise实例对象(可以跟任何表达式,更多的是跟一个返回Promise对象的表达式)

  • await函数不能单独使用, await等待的意思,可以等待任何表达式,不过最常用的是等待一个Promise对象。

  • await可以直接拿到Promise中resolve中的数据。

  • await后续的代码什么时候才执行? 等到结果后,才会执行。 也就是await会阻塞后面的代码

测试代码: 

// 两秒后获得一个随机数
function getRandomNumber(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve(Math.round(Math.random()*3));
        },2000)
    })
}

// async function getRandomNumber(){
//     setTimeout(()=>{
//         return Math.round(Math.random()*3);
//     },2000)
// }

async function test(){
    // 2秒后,获取一个随机数
    let r1 = await getRandomNumber(); //等2秒,可以获取随机数,给变量r1
    let r2 = await getRandomNumber(); //继续等2秒,获取第二个随机数,给变量r2
    let r3 = await getRandomNumber(); // 继续等2秒,获取第三个随机数,给变量r3
    console.log(r1,r2,r3);
}
test();
console.log("---我是6秒前执行的,await关键字并不影响主线程中的代码执行。---")

5.9 Axios

5.9.1 Axios简介

Axios(中文谐音:爱克丝赛欧斯)

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

官方网站:http://www.axios-js.com

源码:https://gitee.com/charlinchenlin/store-pos

特性:

1、从浏览器中创建 XMLHttpRequests

2、从 node.js 创建 http 请求

3、支持 Promise API

4、拦截请求和响应

5、转换请求数据和响应数据

6、取消请求

7、自动转换 JSON 数据

8、客户端支持防御 XSRF

5.9.2 安装方式

 使用 npm:

$ npm install axios

 使用 bower:

$ bower install axios

 使用CDN

 <script src="https://unpkg.com/axios/dist/axios.min.js"></script>

 5.9.3 案例演示

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>axios</title>
</head>
<body>
    <button id="btn1">axios发生get请求--方法</button>
    <button id="btn2">axios发生post请求--方法</button>
    <button id="btn3">axios发生get请求</button>
    <button id="btn4">axios发生post请求</button>
    <br><span id="s1" style="color: red"></span>
</body>
<script src="js/axios.js"></script>
<script>
    let btn1 = document.querySelector("#btn1");
    let btn2 = document.querySelector("#btn2");
    let btn3 = document.querySelector("#btn3");
    let btn4 = document.querySelector("#btn4");

    /*
        axios.get((url,{}))
        解析: url: 请求资源路径
              {}:用于指定其他参数的,比如请求参数,注意请求参数的key是固定写法,必须叫params
                    params的值,也只能是对象形式。
     */

    btn1.addEventListener("click",()=>{
        //模拟从文本框拿到数据后做了一个对象的封装
        let loginInfo = {"username":'zhangsan',password:123456}

        axios.get("checkLogin.lr",{params:loginInfo}).then((response)=>{
            // 因为response这个对象上有一个叫data的属性,该属性用于存储服务端发送过来的数据,因此直接使用data属性即可
            // console.log(response.data)
            let obj = response.data;
            document.querySelector("#s1").innerText=obj.error_msg;
        })
    })

    /**
     * 后端Servlet只能从getReader()里读取数据,getParameter(...)不行
     */
    // btn2.addEventListener("click",()=>{
    //     //模拟从文本框拿到数据后做了一个对象的封装
    //     let loginInfo = {"username":'zhangsan',password:123456};
    //     axios.post("checkLogin.lr",loginInfo).then((response)=>{
    //         // 因为response这个对象上有一个叫data的属性,该属性用于存储服务端发送过来的数据,因此直接使用data属性即可
    //         console.log(response.data)
    //         let obj = response.data;
    //         document.querySelector("#s1").innerText=obj.error_msg;
    //     })
    // })

    btn2.addEventListener("click",()=>{
        //模拟从文本框拿到数据后做了一个对象的封装
        let loginInfo = {"username":'zhangsan',password:123456};
        axios.post("checkLogin.lr","username=zhangsan&&password=123456").then((response)=>{
            // 因为response这个对象上有一个叫data的属性,该属性用于存储服务端发送过来的数据,因此直接使用data属性即可
            console.log(response.data)
            let obj = response.data;
            document.querySelector("#s1").innerText=obj.error_msg;
        })
    })

    /**
     * axios({
     *     url: 请求路径,
     *     method: 请求方式,默认为get,
     *     params/data: get请求时,使用params传请求参数,post请求时,必须使用data传请求参数
     *     headers: 可选,post请求时,必须设置
     * })
     */

    btn3.addEventListener("click",()=>{
        //模拟从文本框拿到数据后做了一个对象的封装
        let loginInfo = {"username":'zhangsan',password:123456};
        axios({
          url:"checkLogin.lr",
          method:"get",
          params:loginInfo
        }).then((response)=>{
            // 因为response这个对象上有一个叫data的属性,该属性用于存储服务端发送过来的数据,因此直接使用data属性即可
            console.log(response.data)
            let obj = response.data;
            document.querySelector("#s1").innerText=obj.error_msg;
        })
    })
    btn4.addEventListener("click",()=>{
        //模拟从文本框拿到数据后做了一个对象的封装
        let loginInfo = {"username":'zhangsan',password:123456};
        axios({
            url:"checkLogin.lr",
            method:"post",
            headers:{"content-type":"application/x-www-form-urlencoded"},
            data:loginInfo
        }).then((response)=>{
            // 因为response这个对象上有一个叫data的属性,该属性用于存储服务端发送过来的数据,因此直接使用data属性即可
            console.log(response.data)
            let obj = response.data;
            document.querySelector("#s1").innerText=obj.error_msg;
        }).catch((error)=>{
            console.log(error);
        })
    })

</script>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/883087.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

指挥平台在应急场所中的主要表现有哪些

在应对自然灾害、公共安全事件等突发危机时&#xff0c;指挥平台作为应急管理体系的核心枢纽&#xff0c;其重要性不言而喻。它不仅承载着信息的快速汇聚、精准分析与高效调度功能&#xff0c;更在应急场所中有一定的关键表现。接下来就跟着北京嘉德立一起了解一下。 一、信息集…

什么是电商云手机?可以用来干什么?

随着电商行业的迅速发展&#xff0c;云手机作为一种创新工具正逐渐进入出海电商领域。专为外贸市场量身定制的出海电商云手机&#xff0c;已经成为许多外贸企业和出海电商卖家的必备。本文将详细介绍电商云手机是什么以及可以用来做什么。 与国内云手机偏向于游戏场景不同&…

GPT-4o在matlab编程中性能较好,与智谱清言相比

边标签由矩阵给出 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G graph(s,t); plot(G) ------------------- GPT-4o给出的代码可用&#xff0c; clc;clear; % 定义边的起点和终点 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 …

中国蚁剑(antSword)安装使用

antSword下载 antSword-Loader下载 作者&#xff1a;程序那点事儿 日期&#xff1a;2024/09/12 19:35 中国蚁剑&#xff08;AntSword&#xff09;是一款跨平台的开源网站管理工具&#xff0c;旨在满足渗透测试人员的需求。它是一个功能强大的工具&#xff0c;可以帮助用户管理…

一,初始 MyBatis-Plus

一&#xff0c;初始 MyBatis-Plus 文章目录 一&#xff0c;初始 MyBatis-Plus1. MyBatis-Plus 的概述2. 入门配置第一个 MyBatis-Plus 案例3. 补充说明&#xff1a;3.1 通用 Mapper 接口介绍3.1.1 Mapper 接口的 “增删改查”3.1.1.1 查询所有记录3.1.1.2 插入一条数据3.1.1.3 …

LeetCode[中等] 155. 最小栈

设计一个支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。int get…

【html网页制作】旅游风景主题网页制作含css动画及js特效(8页面附效果源码)

HTMLCSS旅游风景主题旅游网页制作 &#x1f354;涉及知识&#x1f964;写在前面&#x1f367;一、网页主题&#x1f333;二、网页效果菜单切换效果PageA、整体页Page1、首页Page2、旅行趣事页Page3、旅行美景页Page4、旅行指南页Page5、旅行视频页Page6、留言页Page7、西湖简介…

python-比较月亮大小/数组下标/人见人爱a+b

一:比较月亮大小 题目描述 小理是一名出色的狼人。众所周知&#xff0c;狼人只有在满月之夜才会变成狼。 同时&#xff0c;月亮的大小随着时间变化&#xff0c;它的大小变化 3030 天为一循环。 它的变化情况(从第一天开始)为 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,14,13,12,1…

深度学习之概率论预备知识点(3)

在深度学习中&#xff0c;概率论和数理统计是理解许多算法背后的理论基础。这些知识在处理不确定性、估计模型参数、理解数据分布等方面非常关键 1、概率 一种用来描述随机事件发生的可能性的数字度量&#xff0c;表示某一事件发生的可能性。 概率并不客观存在&#xff0c;是…

华为云centos7.9按装ambari 2.7.5 hostname 踩坑记录

华为云centos7.9按装ambari 2.7.5踩坑记录 前言升华总结 前言 一般都是废话&#xff0c;本人专业写bug业余运维。起初找了三台不废弃的台式机&#xff0c;开始重装centos系统&#xff0c;开始了HDP3.1.5Ambari2.7.5安装。 推荐一波好文&#xff0c;一路长绿。跑了一段时间没啥…

学习国语的时候需要用到什么翻译工具?《维汉翻译通》app现在已经支持国语拼音和维汉词典查单词功能

《维汉翻译通》App是一款免费的翻译工具&#xff0c;专为维吾尔语与中文之间的沟通设计。它不仅是一款翻译应用&#xff0c;也是新疆人学习中文的得力助手。 功能亮点 免费翻译服务&#xff1a;提供快速准确的短文本翻译&#xff0c;无论是日常用语还是专业术语。智能OCR技术&…

mysql批量修改表前缀

现有表前缀xh,批量修改为fax_需要怎么做 SELECTCONCAT(ALTER TABLE ,table_name, RENAME TO fax_,substring(table_name, 3),;) FROMinformation_schema. TABLES WHEREtable_name LIKE xh_%; 运行之后可以但是生成了一批修改表明的命令 此时批量复制执行就可实现批量修改表前…

基于Node.js+Express+MySQL+VUE新闻网站管理系统的设计与实现

1. 引言 随着互联网技术的发展&#xff0c;人们获取信息的方式发生了巨大的变化。传统的新闻媒体逐渐向数字化、智能化方向发展。新闻推荐网站管理系统能够帮助新闻网站更好地管理和推荐新闻内容&#xff0c;提高用户体验。本文将详细介绍一个新闻推荐网站管理系统的整体设计与…

申论笔记杉树林

同义词尽量用文章中的词进行拼凑不一定要有前置词分条 单一题 同义词给分不一定需要前置词分条 1、2、3、尽量抄文章中的词&#xff0c;通顺即可&#xff0c;不一定要成句子不要过分关注形式 题干&#xff1a; 条理清晰&#xff1a;要求分条&#xff0c;尽量有提示词…

Python网络爬虫获取Wallhaven壁纸图片(源码)

** 话不多说&#xff0c;直接附源码&#xff0c;可运行&#xff01; ** import requests from lxml import etree from fake_useragent import UserAgent import timeclass wallhaven(object):def __init__(self):# yellow# self.url "https://wallhaven.cc/search?co…

浙大数据结构:05-树8 File Transfer

数据结构MOOC PTA习题 这道题考察并查集的操作&#xff0c;合并以及找根结点 机翻&#xff1a; 1、条件准备 node是数组存放1-N结点的根节点的&#xff0c;n为总结点数 #include <iostream> using namespace std;const int N 1e4 5; int node[N]; int n; 先初始化…

C++ | Leetcode C++题解之第420题强密码检验器

题目&#xff1a; 题解&#xff1a; class Solution { public:int strongPasswordChecker(string password) {int n password.size();bool has_lower false, has_upper false, has_digit false;for (char ch: password) {if (islower(ch)) {has_lower true;}else if (isu…

华为HarmonyOS灵活高效的消息推送服务(Push Kit) -- 10 推送实况窗消息

场景介绍 实况窗是一种帮助用户聚焦正在进行的任务&#xff0c;方便快速查看和即时处理的通知形态。有关实况窗简介、权限申请、开放场景、设计规范等说明&#xff0c;请参见Live View Kit简介。 通过Push Kit发送的实况窗消息支持三种操作类型&#xff0c;分别是&#xff1a…

可变剪接分析一步到位,这个 R 包够猛!

生信碱移 ASpediaFI可变剪接 可变剪接&#xff08;Alternative Splicing, AS&#xff09;是基因表达过程中一种重要的调控机制&#xff0c;通过这种机制&#xff0c;单个基因可以产生多个不同的mRNA转录本&#xff0c;这些转录本通过不同的剪接方式&#xff08;即选择性地包括…

Vue使用axios二次封装、解决跨域问题

1、什么是 axios 在实际开发过程中&#xff0c;浏览器通常需要和服务器端进行数据交互。而 Vue.js 并未提供与服务器端通信的接口。从 Vue.js 2.0 版本之后&#xff0c;官方推荐使用 axios 来实现 Ajax 请求。axios 是一个基于 promise 的 HTTP 客户端。 关于 promise 的详细介…