ECMAScript异步编程

ECMAScript异步编程

涉及知识点:

  • ECMAScript2015+
  • Promise
  • async/await

目录


异步编程

这里写图片描述

  • node.js服务器
const express = require('express')
const app = express()

app.get('/', (req, res) => {
    res.setHeader('Access-Control-Allow-Origin', '*')
    setTimeout(() => {
        res.send('Hello');
    }, 3000)
});

app.listen(8080);
  • 异步请求测试
    这里写图片描述

  • 异步:ajax的事情还没有处理完成的时候,我们点击div,是可以立马变色,ajax的事情并不影响当前页面中其他的效果。

  • 同步:当前线程直接处理

回调地狱(callback hell)

    var xhr = new XMLHttpRequest();
    xhr.onload = function() {
        // console.log(this.responseText);
        // 假设获取到了用户信息
        if ( user.isAdmin ) {
            var xhr = new XMLHttpRequest();
            xhr.open('get','http://localhost:8080/getVideo',true);
            xhr.onload = function() {
                // 根据视频信息,当前视频的具体地址
            }
            xhr.send();
        }
    };
    //获取当前用户信息,以下是模拟的url
    xhr.open('get', 'http://localhost:8080/getUserInfo', true);
    xhr.send();
  • 回调地狱的问题:不仅看起来很不舒服,可读性比较差;除此之外还有比较重要的一点就是对异常的捕获无法支持。

Promise对象

基本使用

    new Promise(function(resolve, reject) {
        // 要执行的异步任务
    })
  • Promise的状态: [[PromiseStatus]]
    • pending:初始状态,既不是成功,也不是失败状态
    • fulfilled/resolved:意味着操作成功完成
    • rejected:意味着操作失败

这里写图片描述

  • promise写法影响了书写代码的方式,并没有改变异步的本质。

  • Promise状态:

    • resolve()函数:更改Promise对象为成功状态
    • reject()函数:更改Promise对象为失败状态
  • then方法
    • 任务后续处理函数,一般情况下处理某个Promise任务完成(无论成功还是失败)的后续任务

这里写图片描述

考虑传参情况(因为考虑到局部变量的局限性)

    new Promise( (resolve, reject) => {
        // resolve, reject 这两个函数是可以传入参数的,参数将被传递给then中的函数进行使用
        setTimeout(() => {
            var a = 10;
            resolve(a);
            reject('出错了');
        }, 2000);
    }).then( v => {
        console.log(v);
    }, err => {
        console.log(err);
    });
    .then(onFulfilled/onResolved, onRejected)
    onFulfilled/onResolved:fulfilled/resolved状态下调用
    onRejected:rejected状态下调用

Promise链

这里写图片描述

  • resolve:会输出1,3
  • reject:会输出2,3

  • 前一个then中没有传入参数时,相当于默认传入了一个Promise对象

这里写图片描述

  • 手动处理then方法,让它返回一个指定状态的Promise对象

手动处理then方法,让它返回一个指定状态的Promise对象

总结上面三种情况:
这里写图片描述

解决不能中途退出的问题(catch)

这里写图片描述

catch捕获错误:
这里写图片描述

输出:登录失败,catch以后

Promise.all()

这里写图片描述

输出:
这里写图片描述

Promise.race()

这里写图片描述

谁先执行完就顺带执行了,race的一个执行了,then方法就执行。
这里写图片描述

Promise.resolve()&Promise.reject()

这里写图片描述

  • Promise.reject()返回一个Rejected状态的Promise对象

  • 传一个promise对象
    这里写图片描述
    输出:错误

  • 包含一个then方法的对象(遇到问题,待解决)

这里写图片描述

async&await

这里写图片描述

这里写图片描述
输出:100,200

考虑失败情况
这里写图片描述

这里写图片描述
输出:100,200,传入的值太大了

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值