2012-10-24 112 views
2

我正在使用javascript的Sharepoint客戶端對象模型,並希望儘可能多地使我的代碼儘可能重用。從異步委託函數返回值

使用COM的示例通常看起來像這樣的調用,然後成功委託函數輸出結果。

function loadProfile() 
{ 
    var context = SP.ClientContext.get_current();   
    var web = context.get_web();   
    var userInfoList = web.get_siteUserInfoList(); 
    camlQuery = new SP.CamlQuery();   
    camlQuery.set_viewXml('');   
    this.listItems = userInfoList.getItems(camlQuery);   
    context.load(listItems);   
    context.executeQueryAsync(Function.createDelegate(this, this.onProfileSuccessMethod), Function.createDelegate(this, this.onFail));  

} 
function onProfileSuccessMethod(sender, args) 
{ 
    var item = listItems.itemAt(0); 
    var first_name = item.get_item('FirstName'); 
    var last_name = item.get_item('LastName'); 
    alert(first_name + " " + last_name); 
} 

function onFail(sender, args) 
{ 
    alert('Error: ' + args.get_message() + '\n' + args.get_stackTrace()); 
} 

我所試圖實現的是能夠返回的值實例化對象之後,但因爲它是異步的,我不知道這怎麼可能,我需要「聽」呼叫完成在返回值之前。

會是這樣的嗎?或者,您是否可以在其創建的函數內部沒有委託功能。對於我有限的理解抱歉!

var profile = new loadProfile("testid"); 
alert(profile.onProfileSuccessMethod()); 


function loadProfile (id) 
{ 
    this.user_id = id; 
    var context = SP.ClientContext.get_current();   
    var web = context.get_web();   
    var userInfoList = web.get_siteUserInfoList(); 
    camlQuery = new SP.CamlQuery();   
    camlQuery.set_viewXml('');   
    this.listItems = userInfoList.getItems(camlQuery);   
    context.load(listItems);   
    context.executeQueryAsync(Function.createDelegate(this, this.onProfileSuccessMethod), Function.createDelegate(this, this.onFail));  
    this.onProfileSuccessMethod = function() 
{ 
    var item = listItems.itemAt(0); 
    this.first_name = item.get_item('FirstName'); 
    this.last_name = item.get_item('LastName'); 
     return this.first_name 


    }; 
} 
+0

不能從異步方法返回 - 你需要他們呼籲作爲成功回調和存儲全局或作爲元素上的數據檢索到的數據。 – feeela

回答

0

如果它是異步的,則不可能從它返回值。您需要使用回調模式。

function secondStep(data){ 
    console.log(data) 
} 

var profile = new loadProfile("testid", secondStep); 

function loadProfile (id, callback) 
    ... 
    this.onProfileSuccessMethod = function(){ 
     callback({}); 
    }