认识异步函数

  1.  同步函数:
    const sum1 =(a,b)=>{
    return a+b
    }
    console.log('AAA');
    console.log(sum(5,6));
    conosle.log('BBB') 异步函数:封装一个函数,这个函数2秒后返回a+b的和
    const sum2 =(a,b,callback)=>{
    setTimeout(()=>{
    callback(a+b)
    },2000)
    } console.log('AAA')
    sum2(2,3,(result)=>{
    console.log(result)
    })
    console.log('BBB') 错误事例:
    const sumAfter2s = (a, b) => {
    setTimeout(() => {
    return a + b;
    }, 2000);
    }
    这里面的return是定时器的这个函数的返回值,外部函数没有返回值
  2. 异步(Asynchronouse):不阻塞CPU,CPU先执行别的程序,这段程序被挂起,等它执行完,执行他的回调函数
  3. 目前的结论:同步函数,自己有返回值,而异步函数没有返回值(个人理解:为什么没有返回值,要拿到他的返回值肯定是有其作用,作用就是有用处,而异步函数会等其他的程序执行完在执行,所以在返回值也没有其作用了)

认识回调黑洞

  • 也叫做回调地狱,callback hell
  • 回调套回调,层次很多,这样会产生回调黑洞
  •   比如利用刚才的sum2这个函数,计算3,4的和,在把这个值与5相加,这些和在与6相加
    三次计算两个数之和
    sum2(3,4,(r1)=>{
    console.log(r1)
    sum2(r1,5,(r2)=>{
    console.log(r2)
    sum2(r2,6,(r3)=>{
    console.log(r3)
    })
    })
    }) 这样的代码难以阅读,和维护,叫做回调黑洞
  • 下面引入Promise,来解决回调地狱

Promise -写同步的方法,写异步

  • 认识到生活中的电器缺少锲约

    • 生活中的电器都是异步工作的,他们工作的时候人不会被阻塞,人可以干别的
    • 这些电器在结束工作之后,干的事儿不同,通知形式也不同
    • 洗衣机在结束工作后,播放春天在哪里,微波炉工作结束后滴的一声
    • 通知形式不同的哲学就是:缺少契约
    • Promise就是为了统一这种契约来的:Promise生而为契约

Promise的基本使用

  1.  原始:
    const sum2 =(a,b,callback)=>{
    setTimeout(()=>{
    callback(a+b)
    },2000)
    }
    使用Promise:
    const sum2=(a,b)=>{
    return new Promise((callback)=>{
    setTimeout(()=>{
    callback(a+b)
    },2000)
    })
    }
    这里重写了num2方法,不同的是,
    这个函数返回Promise类的实例,在new Promise()的时候,要求传入真正的回调函数。
    new Promise(()=>{})里面做异步语句,异步结束后,调用callback()函数,将a+b传回来
    也就是说定义确实变的麻烦了,但是,调用它的时候,也换来了快感,此时的异步函数是有返回值的 async function main(){
    console.log('AAAA');
    const r1 = await sum2(3, 4);
    const r2 = await sum2(r1, 5);
    const r3 = await sum2(r2, 6);
    console.log(r1);
    console.log(r2);
    console.log(r3);
    console.log('BBBB');
    }
    main(); es6规定,async是标记异步函数的,await后面可以等一个Promise的实例
    有await语句的函数前面必须加async标记,并且箭头函数不行 Promise实例天生就有三种状态:pending(进行中),fulfilled(结束),rejected(失败).
    一上来就处于pending状态,Promise只有它自己内部的语句,能够把它切换成filfilled的状态。 -什么时候切换呢?
    就是new Promise()的时候传入的那个函数的形参被调用的时候,Promise状态会变为fulfilled。
    同时resolve()函数中的参数,将成为这个函数的返回值

Promise实际运用

  1.  顺序读取文件的例子
    原始:
    const fs = require('fs') fs.readFile('./a.txt',(err,nr1)=>{
    console.log(nr1.toString());
    fs.readFile('./b.txt',(err,nr1)=>{
    console.log(nr2.toString());
    fs.readFile('./c.txt',(err,nr1)=>{
    console.log(nr3.toString());
    })
    })
    }) 使用Promise干掉回调地狱,但是使用的时候都要封装
    const doFile=(filename)=>{
    return new Promise((resolve)=>{
    fs.readFile(filename,(err,nr)=>{
    resolve(nr.toString())
    })
    })
    }
    调用:
    async function main(){
    const nr1 = await doFile('./a.txt')
    console.log(nr1);
    const nr2 = await doFile('./b.txt')
    console.log(nr2);
    const nr3 = await doFile('./c.txt')
    console.log(nr3)
    }
    main();
  2.  Ajax顺序读取接口1,2,3
    原始地狱写法:
    $.get('jiekou1.java',(data1)=>{
    alert(data1);
    $.get('jiekou2.java',(data2)=>{
    alert(data2);
    $.get('jiekou3.java',(data3)=>{
    alert(data3);
    })
    })
    }) 使用Promise解决,先封装一下
    const qingqiu = (url)=>{
    return new Promise((resolve)=>{
    $.get(url,data=>{
    resolve(data);
    })
    })
    }
    封装挺恶心的,但是换回的是调用的快感
    async function main(){
    const nr1 = await qingqiu('jiekou1.java')
    alert(nr1);
    const nr2 = await qingqiu('jiekou2.java')
    alert(nr2);
    const nr3 = await qingqiu('jiekou3.java')
    alert(nr3)
    } 用Axios解决封装的麻烦,Axios这个包封装了Promise版的Ajax,把Aajx封装到了Promise里面了
    <script>引入Axios包</script>
    async function main(){
    const nr1 = await axios.get('jiekou1.php').then(data => data.data);
    const nr2 = await axios.get('jiekou1.php').then(data => data.data);
    const nr3 = await axios.get('jiekou1.php').then(data => data.data); alert(nr1);
    } main();
  3.  再vue中axios
    {
    data(){
    return { }
    },
    methods:{
    async loadData(){
    const jg = await axios.get('').then(data=>data.data);
    this.jg = jg
    async changePage(){
    const jg =await axios.get('').then(data=>data.data);
    }
    async changePageSize(){
    const jg =await axios.get('').then(data=>data.data);
    }
    }
    }
    }

理解Promise契约

  1.  将大家都统一了起来
    const xiyifu = (脏衣服,洗衣粉) => {
    return new Promise((resolve) => {
    进水、
    进洗衣粉、
    洗20分钟、
    排水、
    再进水、
    漂水、
    放水、
    resolve(干净衣服);
    });
    }
    const menfan = (冷饭) => {
    return new Promise((resolve) => {
    加蒸汽、
    再加蒸汽、
    再加蒸汽、
    resolve(热饭);
    });
    } async function main(){
    const a = await xiyifu('内裤');
    const a = await menfan('米粒');
    }

Promise方便调错

  1.  try...catch...捕获的“可能发生”的错误,不会影响程序正常执行
    console.log(1);
    console.log(2);
    console.log(3);
    try{
    console.log('★');
    asdfasdflkajsdlfjk
    }catch(e){ }
    console.log(4);
    console.log(5);
    // 打印 1 2 3 ★ 4 5 异步函数不能被try...catch... const sumAfter2s = (a, b) => {
    return new Promise((resolve, reject) =>{
    setTimeout(() => {
    if(a + b > 10){
    resolve(a + b);
    }else {
    reject('两个数字太小')
    }
    }, 2000);
    });
    }; sumAfter2s(3, 4).then(data => {
    console.log(data);
    }).catch(e => {
    console.log(e);
    })

面试题参考

  1.  只写一行语句,实现效果:
    async function foo(){
    // 等到2秒
    await _________________________________________________
    alert('你好');
    }
    foo(); 答案:
    <script type="text/javascript">
    async function foo(){
    // 等到2秒
    const a = await new Promise((resolve) => {
    setTimeout(() => {
    resolve(34)
    }, 2000)
    });
    alert(a);
    } foo();
    </script>

Promise代码详解(show you the code)的更多相关文章

  1. Java中String的intern方法,javap&cfr.jar反编译,javap反编译后二进制指令代码详解,Java8常量池的位置

    一个例子 public class TestString{ public static void main(String[] args){ String a = "a"; Stri ...

  2. HTTP协议状态码详解(HTTP Status Code)(转)

    原文链接:HTTP协议状态码详解(HTTP Status Code) 使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为: 200 – 服务器成 ...

  3. JS - Promise使用详解--摘抄笔记

    第一部分: JS - Promise使用详解1(基本概念.使用优点) 一.promises相关概念 promises 的概念是由 CommonJS 小组的成员在 Promises/A 规范中提出来的. ...

  4. DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解

    本文介绍多层感知机算法,特别是详细解读其代码实现,基于python theano,代码来自:Multilayer Perceptron,如果你想详细了解多层感知机算法,可以参考:UFLDL教程,或者参 ...

  5. springboot扫描自定义的servlet和filter代码详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 这几天使用spring boot编写公司一个应用,在编写了一个filter,用于指定编码的filter,如下: /** ...

  6. ARM Cortex-M底层技术(2)—启动代码详解

    杂谈 工作了一天,脑袋比较乱.一直想把底层的知识写成一个系列,希望可以坚持下去.为什么要写底层的东西呢?首先,工作用到了这部分内容,最近和内部Flash打交道比较多,自然而然会接触到一些底层的东西:第 ...

  7. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  8. ASP.NET MVC 5 学习教程:生成的代码详解

    原文 ASP.NET MVC 5 学习教程:生成的代码详解 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  9. Github-karpathy/char-rnn代码详解

    Github-karpathy/char-rnn代码详解 zoerywzhou@gmail.com http://www.cnblogs.com/swje/ 作者:Zhouwan  2016-1-10 ...

随机推荐

  1. telnet指令研究—以网络聊天程序为例

    一.telnet指令 Telnet取名自Telecommunications和Networks的联合缩写,是早期个人计算机上连接到服务器主机的一个网络指令,由于存在安全问题,现在已经很少被使用.在wi ...

  2. js中的Object.assign接受两个函数为参数的时候会发生什么?

    缘由 今天看到一段代码 return Object.assign(func1, func2); 心生疑惑,为什么 Object.assign 的参数可以是函数? 于是有了下面这一堆东西,其实都是老生常 ...

  3. luogu P4064 [JXOI2017]加法

    题目描述 可怜有一个长度为 n 的正整数序列 A,但是她觉得 A 中的数字太小了,这让她很不开心. 于是她选择了 m 个区间 [li, ri] 和两个正整数 a, k.她打算从这 m 个区间里选出恰好 ...

  4. 《手把手教你》系列进阶篇之3-python+ selenium自动化测试 - python几种骚操作你都知道吗?(详细教程)

    1. 简介 这篇文章主要是给小伙伴或者童鞋们介绍和分享 python几种骚操:读取配置文件.获取根目录的相对路径.获取系统时间和格式化时间显示.字符串切割等等操作.为后边的自动化框架打下一个结实的基础 ...

  5. openstack学习之neutron ml2初始化代码分析

    这里没有 去详细考虑neutron server怎么初始化的,而是直接从加载插件的地方开始分析.首先我们看下下面这个文件. Neutron/api/v2/router.py class APIRout ...

  6. [TimLinux] CPU 常见架构介绍

    1. 简介 系统性能依赖硬件架构,CPU架构决定了硬件的布局.常见的CPU架构:SMP, NUMA, MPP. 2. SMP(对称多处理器) SMP:Symmetric Multiprocessing ...

  7. HYSBZ-2002弹飞绵羊

    某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置设定初始弹力系数ki,当 ...

  8. 2018HDU多校训练-3-Problem M. Walking Plan

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6331 Walking Plan  Problem Description There are n inte ...

  9. 02 | Java内存模型:看Java如何解决可见性和有序性问题

    什么是 Java 内存模型? 导致可见性的原因是缓存,导致有序性的原因是编译优化,那解决可见性. 有序性最直接的办法就是禁用缓存和编译优化,但是这样问题虽然解决了,我们程序的性能可就堪忧了.   合理 ...

  10. 2019百度阿里Java面试题(基础+框架+数据库+分布式+JVM+多线程)

    前言 很多朋友对面试不够了解,不知道如何准备,对面试环节的设置以及目的不够了解,因此成功率不高.通常情况下校招生面试的成功率低于1%,而社招的面试成功率也低于5%,所以对于候选人一定要知道设立面试的初 ...