为了账号安全,请及时绑定邮箱和手机立即绑定

js异步阻塞问题

js异步阻塞问题

慕姐4208626 2018-12-19 18:15:51
我又修改了一下代码,增加了当auth过期,清除auth的代码,模拟了第一次请求就会过期的情况:let res = 'expired'function request(url, auth) {    return new Promise((resolve, reject) => {        console.log(`${url} request`)        let ret = res        if (url == 'getAuth') {            ret = 'token'        }        setTimeout(() => {            if (ret == 'expired') {                reject('expired')            } else {                resolve(`${url} done`)            }        }, 2000)    })}let _auth = nullfunction getAuth () {    if (_auth == null) {        _auth = request('getAuth').then(_ => {            return 'token'        })    }    return _auth}function fetch(url) {    return getAuth().then(auth => {        return request(url, auth).catch(err => {            if (err == 'expired') {                res = 'success'                _auth = null                return fetch(url, auth)            } else {                return Promise.reject(err)            }        })    })}
查看完整描述

1 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

执行两次getAuth都是应为把异步操作获取的auth作为了判断是否进行执行getAuth的条件,还是同样的解决方法把auth修改为Promise对象,需要获取auth值通过await auth即可.


主要修改getAuth方法


async function getAuth () {

  if (_auth) {

    return Promise.resolve(await _auth)

  } else {

    _auth = request('getAuth').then(_ => {

      return 'token'

    })

    return _auth

  }

}

如果无法使用await那么需要在对auth包裹一层,一样的效果:


async function getAuth () {

  if (_auth) {

    return new Promise((resolve) => {

      _auth.then(resolve)

    })

  } else {

    _auth = request('getAuth').then(_ => {

      return 'token'

    })

    return _auth

  }

}

这样每次request获取到的auth,依然是token这个字符串,同样不会出现两次get_Auth请求


执行:


fetch('test1').then(console.log)

fetch('test2').then(console.log)

执行结果:


getAuth request

test1 request

test1 done

test2 request

test2 done


查看完整回答
反对 回复 2019-01-14
  • 1 回答
  • 0 关注
  • 1129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号