鍍金池/ 問答/HTML/ 調(diào)用B函數(shù)時,如果A函數(shù)沒有執(zhí)行則調(diào)用A,如果正在執(zhí)行則等待A函數(shù)執(zhí)行完成,如果

調(diào)用B函數(shù)時,如果A函數(shù)沒有執(zhí)行則調(diào)用A,如果正在執(zhí)行則等待A函數(shù)執(zhí)行完成,如果已經(jīng)執(zhí)行完成則直接執(zhí)行B函數(shù)代碼

對于函數(shù)A,功能是異步獲取用戶數(shù)據(jù),官方提供了success和fail。
現(xiàn)在有個需求,有時候函數(shù)A會單獨執(zhí)行而不需要在執(zhí)行成功后執(zhí)行B函數(shù),而B函數(shù)又需要獲取用戶數(shù)據(jù)后在執(zhí)行。

我現(xiàn)在給A函數(shù)設(shè)定了標(biāo)記 gettingUserData用來標(biāo)記函數(shù)A正在執(zhí)行,那么對于函數(shù)B,如果函數(shù)A正在執(zhí)行那么就不需要再次執(zhí)行函數(shù)A,他只需要等待A函數(shù)成功執(zhí)行然后再執(zhí)行B自己需要的代碼,這里就不知道怎么處理了。

希望能等待A執(zhí)行完成后立即執(zhí)行B自己的代碼,本來使用while( !window.getUserData ){ }結(jié)果發(fā)現(xiàn)不行,該怎么處理呢。

function A( resolve, reject ){
    var self = this
    window.gettingUserData = true
    sucess:{//異步執(zhí)行(獲取用戶數(shù)據(jù))
        window.getUserData = true
        resolve(  )
    },
    fail:{
        reject(  )
    }
}

function B(  ){
     var callBack = function(  ){
        //B函數(shù)需要執(zhí)行的代碼
    }    

    var p = new Promise( A )
    if( window.getUserData ){//如果用戶數(shù)據(jù)已經(jīng)獲取了,那么執(zhí)行函數(shù)B代碼
        callBack( )
    }else{
        if(  !window.gettingUserData ){//A函數(shù)還沒執(zhí)行
            p.then( callBack )
        }else{//A函數(shù)正在執(zhí)行
            //等待A函數(shù)執(zhí)行完成,A完成后立即執(zhí)行自己的代碼,怎么處理??
        }
    }
}
回答
編輯回答
夏木

利用Promise狀態(tài)一旦確定就不會更改的原則,只要是同一個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();
2018年4月17日 23:28