IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> day4 重点 :解决异步编程的方案 -> 正文阅读

[JavaScript知识库]day4 重点 :解决异步编程的方案

day4

解决异步编程的方案

  • 回调函数(回调地狱)

  • generator(生成器函数)

  • promise(承诺对像)

  • aync 目前最简便的解决异步编程的方案

1.Generator函数 生成器函数(异步编程的解决方案)

? 形式上来看,Generator函数是一个普通函数。但是有两个特征:function关键字与函数名之间有一个星号;函数体内部使用yield表达式,定义不同的内部状态。

执行

调用Generator函数,返回一个遍历(迭代)器对象,代表Generator函数的内部指针可以调用遍历器对象的next方法,就会返回一个有着value和done两个属性的对象 参数可以像普通函数一样传递参数

function* myGenerator(){
    // console.log('123');

    yield 'hello'
    yield 'world'
    yield 'es6'
    return 'end'
}
console.log(myGenerator());
let i =myGenerator()
console.log(i.next());
console.log(i.next());
console.log(i.next());
console.log(i.next());

next参数

next方法可以带一个参数,该参数就会被当作上一个yield表达式的返回值

function* gen(x){
	let y = yield x+1; 
    return y 4 } 
    let iterator = gen(5); 
    iterator.next() // 6
    
    iterator.next(8) //8

Generator函数实现自定义迭代器

创建一个类数组对象的类,用于生成类数组对象,并且实现类数组对象的迭代器函数

class ArrayLike{ 
    constructor(args){ 
        for(let i=0;i<args.length;i++){ 
            let val = args[i] 
            this[i] = val; 
        } 
        Object.defineProperty(this,'length',{ 
            configurable:true, 
            enumerable:false,
			 value:args.length
		 })
	 }
	// 请你实现迭代函数
 	* [Symbol.iterator](){
 		for(let k in this){
 		let v = this[k]
 		let index = parseInt(k)
 		yield {value:v,done:index<this.length?false:true}
 		}
 	}
 }
 let arr = new ArrayLike(['terry','larry','tom']);
 console.log(arr);

 for(let a of arr){
 	console.log(a);
 } 

作用:生成迭代器 异步编程的解决方案

?

2.Promise(异步编程的新解决方案)缓解异步编程

? Promise是一个构造函数,构造一个承诺对象

? 承诺的发起 pending

? 承诺的兑现 resolved

? 承诺未兑现 rejected

axios 基于承诺对象

待定pending 初始状态,既没有被兑现,也没有被拒绝

已兑现fulfilled 意味着操作成功完成

已拒绝 rejected 意味着操作失败

let p =new Promise(function (resolve,reject){
    if(true){
        resolve('承诺兑现了')
    }else{
        reject('承诺未兑现')
    }
    // resolve ('1111')
    // reject('222')
})      //p=>承诺对象


console.log(p);//Promise { <pending> }   承诺发起状态

function getRandom(){
    return new Promise(function(resolve,reject){
        let Random=Math.random()//获取一个随机数
        if(Random>0.5){
            resolve('兑现成功'+Random)
        }else{
            reject('兑现未成功'+Random)
        }
    })
}
let r=getRandom()   //承诺对象
console.log(r);
1.构造函数

创建一个新的promise对象

let p =new Promise(function(resolve,reject){})

Promise 的实现会立即执行参数function函数,并传入resolve和reject函数

2.实例方法

Promise.prototype.then()

为Promise实例添加状态改变时的回调函数,该函数的第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数,它们是可选的

Promise.prototype.catch()

为Promise实例指定发生错误时的回调函数。时then(null,callback)的别名

Promise.prototype.finally()

该方法用于指定不管Promise对象最后状态如何,都会执行的操作

// get请求方法
var axios = {
            // 基于承诺对象机制
            get(url) {
                return new Promise(function (resolve, reject) {
                    // 异步交互
                    // 1.new xhr实例
                    let xhr = new XMLHttpRequest();
                    // 2.设置请求行
                    xhr.open('get', url);
                    // 3.设置请求头
                    xhr.setRequestHeader("Content-Type", "application/json");
                    // 4.发送请求
                    xhr.send()  //参数:这个参数会放到请求体中
                    // 5.监听
                    xhr.onreadystatechange = function () {
                        if (this.readyState == 4) {
                            if (this.status == 200) {
                                resolve(this.response)
                            } else {
                                reject(this.response)

                            }

                        }
                    }
                })
            }
        }
        // 使用
        axios.get('http://139.196.156.38:8888/index/carousel/findAll')
            .then((res) => {
                console.log(JSON.parse(res));
            })
            .catch((err) => {
                console.log(err);
            })
  Promise.allSettled(iterable)
3.静态方法

Promise.all(iterable) Promise.all([p1,p2,p3])

参数是将多个承诺对象合并成一个承诺对象的数组

返回一个新的promise对象,该promise对象在iterable参数对象里所有的promise对象都成功的时候才会触发成功,一旦有任何一个iterable

Promise.allSettled(iterable)

等到所有promises都已敲定settled(每个promise都兑现fulfilled或已拒绝rejected),返回一个promise,该promise在所有promise完成后完成,并带有一个对象数组,每个对象对应每个promise的结果

Promise.race(iterable) Promise.race([p1,p2,p3])

? 只要有一个承诺对象成功或失败

Promise.reject(reason)

返回一个状态为失败的Promise对象,并将给定的失败信息传递对应的处理方法

Promise.resolve(value)

将一个对象转化为承诺对象

3.async await

async函数就是Generator函数的语法糖。异步函数同步化 (从根本上解决了异步函数的问题)

写法:将Generator函数的星号*替换成async,将yield替换成await

//
let axios = require('axios'); 
async function foo(){ 
	let url = 'http://121.199.29.84:8001/index/carousel/findAll' 
	let resp = await axios.get(url) //从后台拿到的一个对象
	console.log(resp.data); 
} 
foo();

//对比普通函数
function findAll(){
    let r =axios.get(url)
    //r是一个承诺对象
}

异步函数的运行结果为Promise对象,异步函数内部的返回只会作为then方法回调函数的参数

<script>
        // 基于承诺对象的封装
         var axios = {
            // 基于承诺对象机制
            get(url) {
                return new Promise(function (resolve, reject) {
                    // 异步交互
                    // 1.new xhr实例
                    let xhr = new XMLHttpRequest();
                    // 2.设置请求行
                    xhr.open('get', url);
                    // 3.设置请求头
                    xhr.setRequestHeader("Content-Type", "application/json");
                    // 4.发送请求
                    xhr.send()  //参数:这个参数会放到请求体中
                    // 设置拿到的响应数据的格式
                    xhr.responseType = 'json'
                    // 5.监听
                    xhr.onreadystatechange = function () {
                        if (this.readyState == 4) {
                            if (this.status == 200) {
                                resolve(this.response)
                            } else {
                                reject(this.response)

                            }

                        }
                    }
                })
            }
        }

        let baseurl='http://139.196.156.38:8888'
        // axios.get(baseurl+'/index/article/pageQuery?page=1&pageSize=10').then((res)=>{
        //     console.log('资讯信息:',res);
        //     let article=res.data.list[0].id
        //     axios.get(baseurl+'/index/article/findById?id='+article).then(res=>{
        //         console.log(res.data);
        //     })
        // })

        // function * gen(){

        // }

        async function findAllacticle(){
            let r=await axios.get(baseurl+
                 '/index/article/pageQuery?page=1&pageSize=10')
            console.log(r.data.list);
        }
        // 执行
        findAllacticle()

    </script>

面向对象 类class…

? 构造函数

? function fun(){}

? 类 是构造函数的语法糖

? 一个类必须有一个constructor

class Animal{
    
    // 一个类必须有一个constructor
    constructor(name,age){
        this.name=name;
        this.age=age
    }
    // 成员方法
    sayHello(){
        console.log('hello my name is '+this.name);
    }
    // 成员属性
    gender=10
    // 静态方法
    static sayAge(age){
        console.log('I am '+age+' years old');
    }
    // 静态属性
    static gender='男'
}
// Animal的实例对象
let a=new Animal('jerry',2)   
console.log(a);//{}
// 成员方法的访问
a.sayHello()//hello my name is jerry
// 静态方法的调用
Animal.sayAge(13)
// 成员属性的访问
console.log(a.gender);
// 静态属性的访问
console.log(Animal.gender);

? 继承

? 原型链继承

? function Animal(){}

? function Dog(){}

? Dog.prototype=new Animal()

? 经典继承 (借用构造函数继承)

? function Dog(){

? Animal.call(this,‘tom’)}

? 组合继承 (原型链和借用构造函数的组合继承)

// 继承

// 父类
class Animal{
    sayHello(){
        console.log('hello');
    }
}
// 子类
class Dog extends Animal{
    constructor(){
        // 一定要的函数方法
        super()
    }
}

let d=new Dog();
d.sayHello()

axios

? 纯粹的http库,基于promise(专业)

? 既能在浏览器使用又能在nodejs上使用

? 拦截操作

? 1.响应拦截(拿到响应信息之前干的事情)

? 2.请求拦截(请求发送之前干的一个事情)

jquery ajax基于回调函数

1)使用

? 安装

  • CND

  • npm(cnpm yarn)

    npm install axios --save

2)利用模块化导入axios

3)使用axios(options)

//1. 使用npm方式安装  npm install axios --save
// 2.commonjs的模块化  导入
let axios=require('axios')
//3. 使用Axios(options)
// axios({
//     method:'get',
//     url:'http://139.196.156.38:8888/index/project/pageQuery',
//     data:{}//post请求,参数
//     params:{
//         page:1,
//         pageSize:10
//     }//get 请求,参数
// }).then((res)=>{
//     console.log(res.data);
// })
// 快捷方法
// axios.get(url,{option/config})
axios.get('/index/project/pageQuery',{    
// 请求的基础路径    
	baseURL:'http://139.196.156.38:8888',    
	params:{        
	page:1,        
	pageSize:10    
}}).then(res=>{    
// console.log(res.data);    
let r=res.data;    
if(r.status==200){        
	console.log(r.data.list[0]);
    }})
  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-10-08 11:42:45  更:2021-10-08 11:45:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 23:04:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码