js异步阻塞问题

我又修改了一下代码,增加了当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 = null

function 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)

            }

        })

    })

}


慕姐4208626
浏览 1130回答 1
1回答

慕的地10843

执行两次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 requesttest1 requesttest1 donetest2 requesttest2 done
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript