2014-04-19 189 views
0

我想發起一個數據庫請求,這需要幾個時間和一個整數的響應(42)。 setTimeout in dbRequest()代表此請求。異步調用函數

在函數initRequest中,響應的整數應該加1。因此initRequest應返回43

var dbRequest = function() { 

    setTimeout(function(){ 
    console.log('Hello World! => 42'); 
    return 42; 
    }, 5000); 

}; 

var initRequest = function (cb){ 
    var test = cb() + 1; 
    console.log('Incremented Value: ' + test); 
    return test; 
}; 

initRequest(dbRequest); 

可惜var test = cb() + 1;不等待setTimeoutNaN計算。 輸出:

Incremented Value: NaN 
// 5 sec delay 
Hello World! => 42 

我怎樣才能讓這個函數異步的,讓initRequest等待dbRequest迴應?

+1

你似乎有東西倒退。函數_is_異步,這意味着它不會等待。 – Barmar

+1

任何取決於異步操作結果的東西都必須在其回調函數中完成。 Javascript是單線程的,它不能停留在原始函數中,而是同時執行異步調用。 – Barmar

+0

基本上同樣的問題在這裏:http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call該問題處理'AJAX'請求,而不是'setTimeout' ,但它是相同的異步問題 –

回答

2

準確地不知道你的情況,但爲了得到渴望的結果,你可以做這樣的事情。

var dbRequest = function (callback) { 
    setTimeout(function(){ 
     console.log('Hello World! => 42'); 
     callback(42); 
    }, 5000); 
}; 

function initRequest(val){ 
    var test = val + 1; 
    console.log('Incremented Value: ' + test); 
} 

dbRequest(initRequest); 

在特定時間後調用回調函數,並將此值與此調用的函數一起傳遞以進行願望操作。