前端异步流程工具

  1. 为什么要进行异步操作?
    • javascript是单线程,依次执行一个任务,要想让任务能够顺利进行,我们需要排队
    • 异步就是将任务放入异步队列,在主线程执行结束之后再去执行
  2. 前端异步的操作方式
    • 传统方式
      • 回调函数
      • 事件
    • 前端异步流程工具 【 封装出来函数、库 】
      • es6 Promise
        • Promise对象代表一个异步操作,有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)
        const p1 = new Promise(( resolve,reject ) => {
            resolve( '任务一' )
        })
            .then( data => {
                console.log( data )
        })
            .catch( error => {
              if ( error ) throw error   // 抛出一个错误,这个时候进程会被终端
        })
        
        • Promise.all([promise实例1,promise实例2])
        • all中,一次执行任务,即使有延时任务,也必须等待延时任务结束,后续任务才能进行Promise
        • Promise.race() ,数组中一个promise实例完成即完成
        • race指的是 任务快 的先进行,其他延时任务后续进行
      • es6 Generator函数
        • function 关键字后面跟一个*来定义一个generator函数
        • 使用yield关键字来定义任务
        function* p1 () {
          // yield 任务
          yield '任务一'
          yield '任务二'
          return '任务六'
        }
        
        const task = p1() // 迭代器Iterator对象
        
        console.log( task.next() ) // 通过next方法来遍历执行任务
        console.log( task.next() ) // 通过next方法来遍历执行任务
        // { value: '任务六', done: true } 
        
        /* 
            value 表示任务执行的结果
            done  表示总任务执行状态 
        */
        
      • es6 - es8 async 函数
        async function p1 () {
            const result = await '任务一'
            return result 
        }
        console.log( p1().then( res => console.log( res )) )
        console.log(' 主线程')
        
        
        • async函数返回一个 Promise 对象。
        • async函数内部return语句返回的值,会成为then方法回调函数的参数。
        async function f() {
            return 'hello world';
        }
        
        f().then(v => console.log(v))
        // "hello world"
        
        • 上面代码中,函数f内部return命令返回的值,会被then方法回调函数接收到。
        • async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到。
        async function f() {
            throw new Error('出错了');
        }
        
        f().then(
            v => console.log(v),
            e => console.log(e)
        )
        // Error: 出错了
        
      • Node中的异步处理工具: nextTick setImmediate
        • Node.js全局变量是global
        • 轮询的第一个是Process.nextTick() ,最后一个是setImmediate(),所以Process.nextTick()比setImmediate()先执行
        process.nextTick( () => {
            console.log('A')
        })
        
        setImmediate(() => {
            console.log('C')
        })
        
        console.log('主线程')
        
        //结果顺序--主线程,A,C
        
      • 第三方类库: async.js
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值