async/await分析和实现

如何理解async

async的原理就是将generator和自动执行函数包装在一个函数里面,generator手动调用next直到return,而async则是自动执行

  • async 通过自动执行函数返回的是一个Promise
async function test(){
    return Promise.resolve(1)
}
test().then( val => console.log(val) ) // 1

async function testA(){
    return 1 //返回的是primitive值,会被自动执行函数包装返回Promise
}
testA().then( val => console.log(val) ) // 1


  • async的自动执行函数(auto)实现
// 自动执行函数接受一个generator,递归调用后返回Promise
function autoWrap(genF){
    return new Promise((resolve,reject) => {
        let gen = genF() //返回一个状态机
        function auto(nextF){
            let next 
            try{
                next = nextF() // 有可能传进来的函数不对,捕获异常
            } catch(e){
                reject(e)
            }
            if(next.done) return resolve(next.value)
            Promise
            .resolve(value) //递归调用
            .then(val => auto(() => gen.next(val))) //上一次的值继续传给下个next
            .catch(err => reject(err))
        }
        auto(() => gen.next())
    })
}


  • async fn()
async function fn(args){} 

// 等价于
function fn(args){
    return autoWrap(function * (){})
}
fn() // 执行完返回的是一个promise

await

  • await只能在async中使用,对Promise求值

async function log(){
   return  1
    
}
async function test(){
  log().then(res => console.log(`then方式:${res}`) )
  console.log(`await方式:${await log()}`)
}
test()
// then方式:1
// await方式:1


  • dispatch

function dispatch(action) {
  if (!isPlainObject(action)) {
    throw new Error(
      'Actions must be plain objects. ' +
      'Use custom middleware for async actions.'
    )
  }
  // 判断 action 是否有 type{必须} 属性
  if (typeof action.type === 'undefined') {
    throw new Error(
      'Actions may not have an undefined "type" property. ' +
      'Have you misspelled a constant?'
    )
  }
  // 如果正在 dispatch 则抛出错误
  if (isDispatching) {
    throw new Error('Reducers may not dispatch actions.')
  }
  // 对抛出 error 的兼容,但是无论如何都会继续执行 isDispatching = false 的操作
  try {
    isDispatching = true
    // 使用 currentReducer 来操作传入 当前状态和action,放回处理后的状态
    currentState = currentReducer(currentState, action)
  } finally {
    isDispatching = false
  }
  var listeners = currentListeners = nextListeners
  for (var i = 0; i < listeners.length; i++) {
    var listener = listeners[i]
    listener()
  }
  return action
  }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值