【问题标题】:Exposing variables returned as an array by function通过函数公开作为数组返回的变量
【发布时间】:2013-11-01 01:02:20
【问题描述】:

我知道这是一个函数 101 类型的问题,但我们都需要学习。

我有一个 AJAX 调用函数(下面的 sn-p)存储在我自己的库 .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”选项),并且所有变量都在我的警报语句中正确填充,然后再进行任何进一步的下游处理[似乎]发生了。

【问题讨论】:

  • Possible Duplicate。简短的回答 - 这不是异步请求在 JS 中的工作方式。长答案在链接中:)
  • 显示更多完整的脚本,复制和粘贴可能会发现拼写错误,它有助于社区更好地了解依赖关系和程序流程等。
  • 感谢您迄今为止的所有反馈。我已经编辑了这篇文章以提供更多的代码细节,尽管这样做承认这给问题带来了明确的 SharePoint 倾斜。

标签: javascript function


【解决方案1】:

您正在进行 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;
}
}

【讨论】:

    【解决方案2】:

    如果本次处理中有异步ajax函数:

    function getMyDetails(){
    //does processing including async ajax calls
    
        return { 
            firstName: firstName,
            office: office, 
            manager: manager, 
            workphone: workphone, 
            isAdministrator: isAdministrator 
            }
       }
    

    那么,问题在于 ajax 调用的异步性质意味着它要到稍后才能完成。因此,您不能像现在这样使用正常的顺序编程,因为当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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多