2017-07-01 66 views
0

正如我想了解js回調我遇到了這個問題。 這裏我試圖在2500 ms之後提醒aa,也就是說,當aa的值已解決但我得到的結果爲1。爲什麼? 我認爲aa這裏沒有定義,但b()在調用堆棧中,它應該解析aa的實際值。 如果我錯了,請糾正我。javascript回調不工作異步方式

function a(b){ 
 
    var aa = b(); 
 
    
 
    setTimeout(function(){ 
 
    alert(aa) 
 
    },3000) 
 
    } 
 
    
 
    function b() { 
 
    return setTimeout(function() { 
 
    return 'alert this value !'; 
 
    },2500) 
 
    } 
 
    
 
    a(b);

+1

'1'是你的第二個'setTimeout()'的定時器引用。你不能像這樣從'setTimeout()'回調中返回一個值。 – Sirko

回答

1

不能從這樣一個異步函數返回一個值。獲得類似的行爲的一種方法是使用promises

async function a(b){ 
    var aa = await b(); 

    setTimeout(function(){ 
     alert(aa) 
    },3000) 

) 

function b() { 
    return new Promise((resolve, reject) => { 
    setTimeout(function() { 
     resolve('alert this value !'); 
    },2500) 

    } 
} 

a(b); 

當你沒有在您的處置async/await做,你也可以使用then()回調承諾在a()

function a(b){ 
    b().then((value) => { 
     setTimeout(function(){ 
     alert(value) 
     },3000) 
    }); 
) 
+0

謝謝,這是一個更好的方法 –