You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SharePoint 2013中用JavaScript获取当前用户并实现函数传值

解决SharePoint JSOM异步函数返回值并在其他函数使用的问题

你遇到的其实是异步操作的典型坑:SP.ClientContext.executeQueryAsync是异步执行的,当你调用showUserInfo()时,函数会立刻返回(此时异步请求还在后台跑),所以var test = showUserInfo()拿到的是undefined,自然alert不出正确的登录名。

要解决这个问题,我们需要用异步的方式来处理返回值,下面给你两种常用的方案:

方案1:用Promise + async/await(推荐,代码更易读)

把showUserInfo封装成返回Promise的函数,这样就能在其他函数里等待异步操作完成后拿到值:

SP.SOD.executeOrDelayUntilScriptLoaded(testCase,"sp.js");

function showUserInfo(){
  // 返回一个Promise对象
  return new Promise((resolve, reject) => {
    var clientContext = SP.ClientContext.get_current();
    var user = clientContext.get_web().get_currentUser();
    clientContext.load(user);
    clientContext.executeQueryAsync(
      // 请求成功时,把登录名传递出去
      function(){
        resolve(user.get_loginName());
      },
      // 请求失败时,把错误信息传递出去
      function(sender, args){
        reject(args.get_message());
      }
    );
  });
}

// 用async/await来等待异步结果
async function testCase() {
  try {
    // 这里会等待showUserInfo的异步操作完成,再把结果赋值给test
    var test = await showUserInfo();
    alert(test); // 现在能正确弹出登录名了
    
    // 直接把test传给其他函数使用
    useUserLogin(test);
  } catch (error) {
    // 捕获异步操作的错误
    alert(error);
  }
}

// 示例:接收登录名的其他函数
function useUserLogin(loginName) {
  console.log("在其他函数中拿到的登录名:", loginName);
  // 这里可以编写你需要的业务逻辑
}

方案2:用传统回调函数

如果你不想用Promise,也可以给showUserInfo传入一个回调函数,在异步操作完成后调用这个回调来传递值:

SP.SOD.executeOrDelayUntilScriptLoaded(testCase,"sp.js");

function showUserInfo(callback){
  var clientContext = SP.ClientContext.get_current();
  var user = clientContext.get_web().get_currentUser();
  clientContext.load(user);
  clientContext.executeQueryAsync(
    // 成功时调用回调,第一个参数是错误(null表示无错误),第二个是登录名
    function(){
      callback(null, user.get_loginName());
    },
    // 失败时调用回调,第一个参数是错误信息,第二个是null
    function(sender, args){
      callback(args.get_message(), null);
    }
  );
}

function testCase() {
  // 传入回调函数,在异步完成后处理结果
  showUserInfo(function(error, loginName) {
    if (error) {
      alert(error);
      return;
    }
    alert(loginName);
    // 把登录名传给其他函数
    useUserLogin(loginName);
  });
}

function useUserLogin(loginName) {
  console.log("在其他函数中拿到的登录名:", loginName);
}

核心思路就是:因为JSOM的操作是异步的,不能像同步函数那样直接return值,必须通过Promise或者回调函数的方式,等到异步请求完成后再获取并传递值给其他函数。

内容的提问来源于stack exchange,提问作者Milan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 08:32:28