如何在SharePoint 2013中用JavaScript获取当前用户并实现函数传值
你遇到的其实是异步操作的典型坑: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
相关产品推荐
相关产品推荐

