2013-06-03 38 views
0

假設我有這樣的多回調需要

var a = getData(); 

function getData() { 
if (some_condition) { // Do this } 
else {// Do this } 
return fetchFromDB(param); 
} 

function fetchFromDB(param) { 
db.transaction(function (tx) { 
    tx.executeSQL("SELECT foo FROM bar WHERE column = ? ", [param], function (tx, res) { 
    return res.rows.item(0).foo 
    }); 
}); 
} 

問題的腳本是tx.executeSQL是異步的,所以fetchFromDB()方法返回undefined對來電者即的getData(),同樣的不確定被傳遞迴主功能。 爲了避免這種情況我必須fetchFromDB()一個回調像

tx.executeSQL("SELECT foo FROM bar WHERE column = ? ", [param], function (tx, res) { 
    callBack1(res.rows.item(0).foo); 
    }); 

所以現在值返回的getData(),但我需要在這裏有一個callback2返回主功能也從調用callback1返回數據。通過這種方式,我似乎需要回撥我曾經打過電話的地方。當然,我在這裏錯過了一些東西!我怎樣才能限制一個回調?

+0

@elclanrs能否請您解釋一點實現這一目標。 – GoodSp33d

+0

你不能。正如你發現的那樣,你只能通過回調返回異步調用的結果。 – JohnnyHK

回答

0

您可以通過使用嵌套函數

function f1() { 
    function f1callback(param) { 
     console.log(" callback 1 " + param); 
    } 
    f2(f1callback); 
} 

function f2(callback) { 
    function f2callback(param) { 
     console.log(" callback 2 " + param); 
     callback(param); 
    } 
    f3(f2callback); 
} 

function f3(callback) { 
    function f3callback(param) { 
     console.log(" callback 3 " + param); 
     callback(param); 
    } 
    f4(f3callback); 
} 

function f4(callback) { 
    setTimeout(function() { 
     callback("data"); 
    }, 1000); 
} 

f1(); 
+0

但我期待f1()返回數據,像這樣的http://jsfiddle.net/yN4xB/(注意,首先它會拋出未定義,然後調用回調) – GoodSp33d

+0

@ 2-Stroker - 回調不會「返回」數據。回調*使用*數據。無論您需要如何處理數據,都可以在回調中執行 - 或者從回調中調用的另一個函數中。你的問題中的第二個代碼片段看起來很好 - 'callBack1'函數將接收'foo'數據並對它做些什麼。用這種方法你有什麼問題? –

+1

@ 2-Stroker:你可以編寫一個函數來完成所有使用'foo'的操作,並像這樣在回調中調用它 - http://jsfiddle.net/yN4xB/3/ – Diode