zoukankan      html  css  js  c++  java
  • 了解promise和async await的区别

    学习过程中只会使用,不太了解这些个的区别,学习了解下:
    首先说说两者的概念:
    • Promise
      Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大,简单地说,Promise好比容器,里面存放着一些未来才会执行完毕(异步)的事件的结果,而这些结果一旦生成是无法改变的

    • async await
      async await也是异步编程的一种解决方案,他遵循的是Generator 函数的语法糖,他拥有内置执行器,不需要额外的调用直接会自动执行并输出结果,它返回的是一个Promise对象。

    两者的区别
    1. Promise的出现解决了传统callback函数导致的“地域回调”问题,但它的语法导致了它向纵向发展行成了一个回调链,遇到复杂的业务场景,这样的语法显然也是不美观的。而async await代码看起来会简洁些,使得异步代码看起来像同步代码,await的本质是可以提供等同于”同步效果“的等待异步返回能力的语法糖,只有这一句代码执行完,才会执行下一句。

    2. async await与Promise一样,是非阻塞的。

    3. async await是基于Promise实现的,可以说是改良版的Promise,它不能用于普通的回调函数。

      简单来看,这两者除了语法糖不一样外,他们解决的问题、达到的效果是大同小异的,我们可以在不同的应用场景,根据自己的喜好来选择使用。

    // promise方法
        let p1 = new Promise((resolve,reject) => {
            setTimeout(() => {
                resolve('我是p1')
            },4000)
        })
        let p2 = new Promise((resolve,reject) => {
            setTimeout(() => {
                resolve('我是p2')
            },200)
        })
        let p3 = new Promise((resolve,reject) => {
            setTimeout(() => {
                resolve('我是p3')
            },200)
        })
        // 想让p1完成后再执行P2再执行P3
        // 数量太多只能这么写
        p1.then((res) => {
            console.log(res);
            p2.then((res) => {
                console.log(res);
                p3.then((res) => {
                    console.log(res);
                })
            })
        })
        
        //下面大神回答的挺好的
        p1.then((res)=>{ console.log(res) return p2 })
        .then((res)=>{ console.log(res) return p3 })
        .then((res)=>{ console.log(res) })
    
    
    
        // async  await语法糖
        let a1=()=>{
            return new Promise((resolve,reject) => {
                setTimeout(() => {
                    resolve('我是a1')
                },4000)
            })
        } 
        let a2=()=>{
            return new Promise((resolve,reject) => {
                setTimeout(() => {
                    resolve('我是a2')
                },40)
            })
        } 
        let a3=()=>{
            return new Promise((resolve,reject) => {
                setTimeout(() => {
                    resolve('我是a3')
                },40)
            })
        } 
        // 想让a1完成后再执行a2再执行a3
        //能避免回调
        async function asy(){
            await a1().then((res) => {console.log(res)});
            await a2().then((res) => {console.log(res)});;
            await a3().then((res) => {console.log(res)});;
        }
        asy();
  • 相关阅读:
    取得手机按键值的midlet
    字符串处理函数C语言实现(二)
    J2ME FileConnection 删除整个目录
    螺旋队列算法详解
    C++ 运算符优先级
    BREW短消息相关
    关于设计表时应该注意的问题
    VC里让输出窗口暂停
    如何在eclipse中对J2ME进行DEBUG
    J2ME 触摸屏处理
  • 原文地址:https://www.cnblogs.com/zhilu/p/13772849.html
Copyright © 2011-2022 走看看