公开变量按函数返回为数组

时间:2013-11-01 01:02:20

标签: javascript function

我知道这是一个函数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'选项)并且在进行任何进一步的下游处理之前,所有变量都在我的警告语句中正确填充[似乎]发生了。

3 个答案:

答案 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?

Why does my jQuery AJAX function always return false?

How to access variable inside a block

答案 2 :(得分:-2)

如果这是javascript,我想知道为什么你使用$来表示一个变量,但是除非我理解你的问题是错误的,否则你如何做到这一点就好了。我通常只使用$ sign函数名来获取像

这样的速记函数
 function $(el){
    return document.getElementById(el)
 }

然而我再次假设其个人偏好。