如何在异步方法中成功执行回调?SharePoint 2013 JSOM问题求助
我太懂这种困扰了!异步操作的返回值问题是JS新手最容易踩的坑之一,尤其是SharePoint JSOM的executeQueryAsync本身就是异步执行的,咱们一步步来解决:
问题出在哪?
你现在的代码里,callback(x)是直接写在executeQueryAsync外面的,但executeQueryAsync是异步请求——浏览器会先执行callback(x),然后才会等SharePoint的请求完成,再跑成功回调里的x.push(y)。这时候调用callback的时候,x还是空数组,自然拿不到邮箱地址,变量q也就成了undefined。
修正后的代码
只需要把callback的调用移到异步请求的成功回调里,确保只有拿到邮箱地址后才触发回调:
var t = oListItem.get_item('ElementContactFullName').get_lookupId(); // 调用时在回调里处理拿到的邮箱 getEmail(t, function(returnedValue){ var q = returnedValue[0]; // 因为你用了数组push,取第一个元素就是邮箱 console.log(q); // 这里就能拿到正确的邮箱地址了 // 所有需要用到q的逻辑都要写在这个回调里面! }); function getEmail(userId, callback) { var context = new SP.ClientContext(); var web = context.get_web(); var user = web.get_siteUsers().getById(userId); context.load(user); context.executeQueryAsync(function() { var email = user.get_email(); callback([email]); // 拿到邮箱后再调用回调传值 } , function(sender, args) { console.log("获取邮箱失败: " + args.get_message()); callback([]); // 出错也可以传空数组或者错误信息,避免回调没触发 }); }
关键知识点
因为异步操作不会阻塞代码执行,所以你没办法像同步函数那样直接把异步结果赋值给变量q,所有依赖这个邮箱地址的逻辑,都必须写在回调函数里面。如果以后想让代码更易读,也可以把这个异步操作包装成Promise,用async/await来写,但对于你的场景,先把回调用对就足够解决问题了。
内容的提问来源于stack exchange,提问作者Mr safe
相关产品推荐
相关产品推荐

