2017-07-27 154 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