2014-04-19 151 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); 

在特定时间后调用回调函数,并将此值与此调用的函数一起传递以进行愿望操作。