2017-07-01 2 views
0

Da ich versuchte, js Rückruf zu verstehen, stieß ich auf dieses Problem. Hier versuche ich zu alarmieren aa nach 2500 ms dh wenn Wert von aa gelöst ist, aber ich bekomme Ergebnis als 1. Warum? Ich denke, aa ist hier nicht definiert, aber b() ist in Call-Stack. Es sollte tatsächlichen Wert von aa auflösen. Bitte korrigieren Sie mich, wenn ich falsch liege.JavaScript Callbacks funktionieren nicht async Weise

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

+1

Das '1' ist die Timer-Referenz zu Ihrem zweiten' setTimeout() '. Sie können keinen Wert aus einem 'setTimeout()' Callback wie diesem zurückgeben. – Sirko

Antwort

1

Sie können einen Wert von einer Asynchron-Funktion wie das zurück. Eine Möglichkeit, ein ähnliches Verhalten zu bekommen wäre zu verwenden 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); 

Wenn Sie nicht über async/await zur Verfügung, können Sie auch den then() Rückruf der Verheißung in a() verwenden:

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

danke das ist ein besserer Ansatz –

Verwandte Themen