2017-07-27 22 views
1

我有一个户外webscript谁返回一个json响应。从外部函数获取Alfresco.util.Ajax.request response.json数据

我有一个js函数getWorkflowRepositoryContent()谁调用这个webscript并获得回复的数据。我的response.json存储在一个数组list

所有的作品都适合我,但是当我从另一个js函数调用getWorkflowRepositoryContent()时,它必须返回一个包含从webscript response收到的数据的数组。

有我从webscript接收到的数据返回的功能。

你能告诉我我犯了什么错误,或者告诉我如何正确地从该函数返回数据。

function getWorkflowRepositoryContent(){ 
    var list=[]; 
    var workflowFilesNameAndNodeRef; 

    var test=function getWorkflowFilesList(response) 
    { 
     workflowFilesNameAndNodeRef=response.json.nodes; 
     $.each(response.json.nodes,function(index,value){ 
      list.push(value.name); 
     }); 

    } 

    Alfresco.util.Ajax.request(
    { 
     method:Alfresco.util.Ajax.GET, 
     url: Alfresco.constants.PROXY_URI + "/ALFRESCO-DIRECTORY", 
     successCallback: 
     { 
      fn:test, 
      scope:this 
     }, 
     failureCallback: 
     { 
      fn: function(response) 
      { 
       Alfresco.util.PopupManager.displayMessage({text:"Failure"}); 
      }, 
      scope: this 
     } 
    }); 
    console.log(list.length); 
    return list; 
} 

回答

0

您的getWorkflowRepositoryContent获取异步数据但同步返回,因此您的示例将无法工作。

一个简单的方法就是简单地用一个回调参数调用你的函数。

function getWorkflowRepositoryContent(cb){ // pass a callback as an argument 
    var list=[]; 
    var workflowFilesNameAndNodeRef; 

    var test=function getWorkflowFilesList(response) 
    { 
     workflowFilesNameAndNodeRef=response.json.nodes; 
     console.log(response.json.nodes); 
     $.each(response.json.nodes,function(index,value){ 
      list.push(value.name); 
     }); 


     $.each(list,function(index, fileName){ 
      $('<option/>').val(fileName).html(fileName).appendTo('#saveButton'); 
      $('<option/>').val(fileName).html(fileName).appendTo('#loadButton'); 
     }); 
     cb(list); // call the callback once the work is done 
    } 

    Alfresco.util.Ajax.request(
    { 
     method:Alfresco.util.Ajax.GET, 
     url: Alfresco.constants.PROXY_URI + "/ALFRESCO-DIRECTORY", 
     successCallback: 
     { 
      fn:test, 
      scope:this 
     }, 
     failureCallback: 
     { 
      fn: function(response) 
      { 
       Alfresco.util.PopupManager.displayMessage({text:"Failure To get StarXpert Workflow content"}); 
      }, 
      scope: this 
     } 
    }); 
} 

getWorkflowRepositoryContent(function(list) { 

    console.log(list); 
}); 

你也可以使用promises但如果你不熟悉它们可能是有点困难。

+1

太好了。这项工作作为代码精细优雅。谢谢 – nmalloul