2015-07-01 76 views
0

我試圖實現讀取SAPUI5中的odata的異步函數調用。嘗試在SAPUI5中的oData上實現異步讀取調用

這裏是一個例子:

this.odataModel = new sap.ui.model.odata.ODataModel(oDataUrl, true, 'user', 'pwd'); 
    /* data retrieving time 5sec */ 
    function read1(){ 
     this.odataModel.read('entity-url1',null, null, true, function(data){ 
     console.log('success'); 
     return data; 
     }, 
     function(){ console.log('error'); }); 
    } 
     /* data retrieving time 10sec */ 
    function read2(){ 
     this.odataModel.read('entity-url2',null, null, true, function(data){ 
     console.log('success'); 
     return data; 
     }, 
     function(){ console.log('error'); }); 
    } 

    /* data retrieving time 10sec */ 
    function read3(){ 
     this.odataModel.read('entity-ur3',null, null, true, function(data){ 
     console.log('success'); 
     return data; 
     }, 
     function(){ console.log('error'); }); 
    } 
/* function calls */ 
var d1 = read1(); 
var d2 = read2(); 
var d3 = read3(); 

這個電話我試圖擺脫。讀函數的數據我得到空的數據之後。執行時間的原因。

我該如何等待,直到執行完成。

+0

SAPUI5是一個模型驅動的框架。那麼爲什麼不將數據存儲在模型中而不是變量中呢?一旦一切都被加載並存儲在模型中,您可以更容易地訪問 – Qualiture

+0

是的,我做到了。在我的情況下,我在不同的頁面中使用這三個函數。當我嘗試重新加載頁面,如果數據可用,它是綁定,如果不是它顯示空值。我該如何解決這個問題。 – mani

+0

你是什麼意思,'重新加載'?在刷新瀏覽器?這不會奏效......您應該在視圖的onAfterRendering事件處理程序或數據檢索回調方法中處理數據。或者,如果您將視圖控件綁定到您的模型,數據將立即顯示,無需任何額外的編碼 – Qualiture

回答

2

你不會看到任何數據,因爲你的請求是異步執行的!如果要處理數據,則必須在模型的讀取方法的成功回調中執行此操作。但即使使用同步調用,也不會看到數據,因爲您的方法read1,read2,read3不返回數據。

1

你看到這一點,因爲sap.ui.model.odata.ODataModel.read()調用是異步的默認 - 在執行您的通話read1()讀,JavaScript的事件隊列繼續處理和執行代碼的其餘部分。這種異步執行是一件好事,但你需要在你的代碼中迎合它。

有幾種解決方案,但最簡單的方法是在第一次執行完成後才啓動第二次讀取,並在第二次完成後才啓動第三次讀取。您可以通過修改您的成功處理程序來完成此操作。

所以,一個很簡陋的調整read1()

function read1(){ 
    this.odataModel.read('entity-url1',null, null, true, function(data){ 
    console.log('success'); 
    read2(); 
    return data; 
    }, 
    function(){ console.log('error'); }); 
} 

然後,做同樣read2()和修改主叫用戶只調用read1()。當然,您需要調整將數據返回給調用者的方式。

有點不整潔,但我希望上面顯示了我想描述的要點。

+0

感謝您的答覆。現在我可以加載數據。有沒有辦法加載讀取函數的緩衝對象? – mani

1

您可以使用jQuery或本機承諾

//jQuery version 
function read1() { 
    var promise = jQuery.Deferred(); 
    this.odataModel.read('entity-url1', null, null, true, function(data) { 
     console.log('success'); 
     promise.resolve(data); 
    }, 
    function() { 
     console.log('error'); 
    }); 

    return promise; 
} 

var d1 = read1(); // d1 promise; 

d1.then(function(data) { 
    console.log(data); 
});