2013-08-07 18 views
0

我不明白與JavaScript回調的東西。我想在Java中做一些像DAO這樣的操作,然後在我的控制器中調用DAO對象。但在JavaScript我有這樣的事情:javascript無法從數據中分離視圖

DAO

function DAO() { 
    this.getData = function(arg1, arg2, callbackSuccess, callbackError) { 
     var data = null; 

     // do something to get data. If ok then call callbackSuccess 
     callbackSuccess(data); 
    } 

    var callbackSuccess = function(data) { 
     // HERE I HAVE THE DATA. HOW TO RETURN IT TO <DATA> ? 
    } 

    var callbackError = function(data) { 
     // ERROR 
    } 
} 

別的地方,我需要獲取數據...

var dao = new DAO(); 
var <DATA> = dao.getData(var1, var2, callbackSuccess, callbackError); 

我也許可以把回調在我的控制器和發送他們的getData方法,但這對我來說似乎很奇怪......

回答

0

您需要了解同步和異步代碼之間的區別。

在同步代碼中,您執行的每個語句都會被評估並將其結果返回給您。在完成評估當前語句之前,沒有其他語句會被評估。因此,陳述總是按順序進行評估。

var a = syncStatement1(); 
var b = syncStatement2(); 
console.log("finished!!!"); 

在上述syncStatement2()代碼將從未syncStatement1()之前進行評估。日誌「完成了!!!」只有當前兩個功能中的所有代碼都完成後才能打印。

但是,在異步代碼中,執行順序是不同的。當您要求評估一個異步語句時,執行引擎會在稍後的某個時間安排它進行評估並繼續執行您的程序。

var a = asyncStatement1(); 
var b = asyncStatement2(); 
console.log("finished???"); 

在上面第二個例子中,執行引擎將不會等待每個語句功能在執行下一條語句之前評估。當你到達伐木線時說「完成了」你不能確定前面的函數是否已經完成執行。

的執行引擎只是安排他們執行,並在某些時候它會執行他們,「回報」無論他們回來,但是當你開始調用他們,並沒有發生。

這有幾個含義,第一個是你不能要求異步函數的結果,比如a = asyncFunc(),因爲如果函數還沒有運行,應該是什麼值a?很可能未定義,因爲尚無結果。但是,根據您如何創建異步函數,您可能會找回一個promise對象,您也可以使用它來取消異步操作,或稍後詢問是否有可用的結果。

第二個含義是,由於代碼稍後會執行,因此在上下文中您無法控制任何事情,要知道發生了什麼的唯一方法是讓函數本身通知您結果,那就是爲什麼你不得不與你的異步函數註冊回調,如:

function asyncFunc(args, success, error) { 
    //do something here 
    if(success) success(data); 
} 

沒有辦法去解決這個假裝的代碼在同步模式實際運行。你被迫改變你的想法。

正如我前面所說,這取決於你使用,你可以從你的異步功能的承諾,改變的事情有點看在稍好的框架:

var promise = asynchFunc(args); 
promise.success(function(data) { 
    //do something with data when successful in async. 
}); 

promise.error(function(error){ 
    //handle the error that happened in async. 
}); 
console.log("Most likely not finished yet!!!"); 

但是,這是仍然是異步執行,到達日誌時,您很可能還沒有處理任何回調。

有些第三方庫如async可以讓你的生活在處理這種類型的代碼時稍微簡單一些,以防你想給他們一些考慮。

最後,解決你的問題,你不能這樣做

var dao = new DAO(); 
var <DATA> = dao.getData(var1, var2, callbackSuccess, callbackError); 

但你可以這樣做:

var <DATA> = null; 
function onSuccess(data){ 
    //act on your data and update controller 
    <DATA> = data; 
} 

function onError(error){ 
    //handle error 
} 

dao.getData(var1, var2, onSuccess, onError);