调用B函数时,如果A函数没有执行则调用A,如果正在执行则等待A函数执行完成,如果已经执行完成则直接执行B函数代码

对于函数A,功能是异步获取用户数据,官方提供了success和fail。
现在有个需求,有时候函数A会单独执行而不需要在执行成功后执行B函数,而B函数又需要获取用户数据后在执行。

我现在给A函数设定了标记 gettingUserData用来标记函数A正在执行,那么对于函数B,如果函数A正在执行那么就不需要再次执行函数A,他只需要等待A函数成功执行然后再执行B自己需要的代码,这里就不知道怎么处理了。

希望能等待A执行完成后立即执行B自己的代码,本来使用while( !window.getUserData ){ }结果发现不行,该怎么处理呢。

function A( resolve, reject ){
    var self = this
    window.gettingUserData = true
    sucess:{//异步执行(获取用户数据)
        window.getUserData = true
        resolve(  )
    },
    fail:{
        reject(  )
    }
}

function B(  ){
     var callBack = function(  ){
        //B函数需要执行的代码
    }    

    var p = new Promise( A )
    if( window.getUserData ){//如果用户数据已经获取了,那么执行函数B代码
        callBack( )
    }else{
        if(  !window.gettingUserData ){//A函数还没执行
            p.then( callBack )
        }else{//A函数正在执行
            //等待A函数执行完成,A完成后立即执行自己的代码,怎么处理??
        }
    }
}
阅读 1.2k
1 个回答

利用Promise状态一旦确定就不会更改的原则,只要是同一个Promise就能完成你的需求。
举个栗子

let promiseA;

function A(by = 'A') {
    if (!promiseA) promiseA = new Promise((reslove, reject) => {
        setTimeout(() => {
            console.log('A success by function', by);
            reslove(by);
            promiseA = null;
        }, 1000)
    })

    return promiseA;
}


function B() {
    A('B').then((data) => {
        console.log('run B recive', data)
    })
}

//测试

function test() {
    console.log('first test')
    A();
    A();
    setTimeout(() => {
        B();
    }, 500)


    setTimeout(() => {
        console.log('second test')
        B();
        setTimeout(B, 500)

    }, 2000)
}

test();
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题