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


    };
}
4

1 に答える 1

0

非同期の場合、そこから値を返すことはできません。コールバック パターンを使用する必要があります。

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

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

function loadProfile (id, callback) 
    ...
    this.onProfileSuccessMethod = function(){
        callback({});
    }
于 2012-10-24T13:53:47.573 に答える