2017-07-01 35 views
0

jsコールバックを理解しようとしていたとき、私はこの問題に遭遇しました。 aaの後に2500 msのアラートを出そうとしています。つまり、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'は、あなたの2番目の' setTimeout() 'へのタイマーリファレンスです。そのような 'setTimeout()'コールバックから値を返すことはできません。 – Sirko

答えて

1

あなたはそのような非同期関数から値を返すことはできません。

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

あなたはまたa()に約束のthen()コールバックを使用することができ、あなたの処分でasync/awaitを持っていないときは:同様の動作を取得するための一つの方法はpromisesを使用することです

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

これはより良いアプローチです –

関連する問題