2012-10-24 113 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({}); 
    }