我知道这是一个函数101类型的问题,但我们都需要在某个时候学习。
我有一个AJAX调用函数(下面的代码段)存储在我自己的库.js文件中,它返回一个对象中的一些变量。
function getMyDetails(){
//does processing
return {
firstName: firstName,
office: office,
manager: manager,
workphone: workphone,
isAdministrator: isAdministrator
}
}
在我的网页上的脚本中,我调用此函数如下:
$userDetails = getMyDetails();
然后尝试引用对象中的项目:
$userFirstName = $userDetails.firstName;
但是在运行脚本时,我在控制台中返回“$ userDetails is undefined”错误。
问:应该如何我引用getMyDetails()函数以使我能够在页面中公开返回的变量?
更新
我的完整功能代码在这里。为了解决问题,我之前没有包含它,因为我正在使用SharePoint网站并使用SPServices库,因此我的AJAX调用被包含在一个单独的库函数中
function getMyDetails(){
var $userName = $().SPServices.SPGetCurrentUser({fieldName: "Name", debug: true });
$().SPServices({
operation: "GetUserProfileByName",
async: false,
AccountName: $userName,
completefunc: function (xData, Status) {
var firstName = getUPValue(xData.responseXML, "FirstName");
var office = getUPValue(xData.responseXML, "Office");
var manager = getUPValue(xData.responseXML, "Manager");
var workphone = getUPValue(xData.responseXML, "WorkPhone");
var SharepointAdministrator = getUPValue(xData.responseXML, "SharepointAdministrator");
alert("What I've got is " + firstName +" and " + office +" and " + manager +" and " + workphone +" and " + SharepointAdministrator);
return {
firstName: firstName,
office: office,
manager: manager,
workphone: workphone,
SharepointAdministrator: SharepointAdministrator
}
}
});
function getUPValue(x, p) {
var thisValue = $(x).SPFilterNode("PropertyData").filter(function() {
return $(this).find("Name").text() == p;
}).find("Values").text();
return thisValue;
}
}
虽然我承认它[通常]不是很好的做法,但我同步进行AJAX调用(使用'async:false'选项)并且在进行任何进一步的下游处理之前,所有变量都在我的警告语句中正确填充[似乎]发生了。
答案 0 :(得分:2)
您正在进行ajax调用,但是您没有捕获返回的结果!
有多种方法可以做到这一点,试试这个:
function getMyDetails(){
var myDetails;
var $userName = $().SPServices.SPGetCurrentUser({fieldName: "Name", debug: true });
$().SPServices({
operation: "GetUserProfileByName",
async: false,
AccountName: $userName,
completefunc: function (xData, Status) {
var firstName = getUPValue(xData.responseXML, "FirstName");
var office = getUPValue(xData.responseXML, "Office");
var manager = getUPValue(xData.responseXML, "Manager");
var workphone = getUPValue(xData.responseXML, "WorkPhone");
var SharepointAdministrator = getUPValue(xData.responseXML, "SharepointAdministrator");
alert("What I've got is " + firstName +" and " + office +" and " + manager +" and " + workphone +" and " + SharepointAdministrator);
myDetails = {
firstName: firstName,
office: office,
manager: manager,
workphone: workphone,
SharepointAdministrator: SharepointAdministrator
};
}
});
return myDetails;
function getUPValue(x, p) {
var thisValue = $(x).SPFilterNode("PropertyData").filter(function() {
return $(this).find("Name").text() == p;
}).find("Values").text();
return thisValue;
}
}
答案 1 :(得分:1)
如果此处理中存在异步ajax函数:
function getMyDetails(){
//does processing including async ajax calls
return {
firstName: firstName,
office: office,
manager: manager,
workphone: workphone,
isAdministrator: isAdministrator
}
}
然后,问题是ajax调用的异步性质意味着它在SOMETIME之后才会完成。因此,您无法按照自己的方式使用常规顺序编程,因为当getMyDetails()
返回时ajax调用尚未完成,因此所有数据值仍未定义。
相反,您必须更改代码的工作方式。你不能像你一样为getMyDetails()
创建一个函数。我不知道你要做什么的整体结构,但你可能需要将使用ajax调用结果的逻辑放入一个在ajax函数完成时调用的回调函数。
这可能是这样的:
function getMyDetails(callback){
//does processing including ajax calls
// inside the ajax success handler, put this:
callback({
firstName: firstName,
office: office,
manager: manager,
workphone: workphone,
isAdministrator: isAdministrator
});
}
然后,当你想要使用它时,你可以这样使用它:
getMyDetails(function(data) {
// code goes here that uses data.firstName, data.office, data.manager, etc...
});
然后,所有使用详细信息的代码都必须放入该回调函数中。你不能像使用异步ajax调用一样进行正常的顺序编程。
其他相关答案:
How to call an asychronous JavaScript function and block the original caller
How to get value from a javascript function which is using ajax
Undefined Indexes in Array after Asynchronous Requests
How do "recursive AJAX callbacks" in JavaScript work?
答案 2 :(得分:-2)
如果这是javascript,我想知道为什么你使用$来表示一个变量,但是除非我理解你的问题是错误的,否则你如何做到这一点就好了。我通常只使用$ sign函数名来获取像
这样的速记函数 function $(el){
return document.getElementById(el)
}
然而我再次假设其个人偏好。