Получить данные Alfresco.util.Ajax.request response.json из внешней функции

У меня есть сценарий на открытом воздухе, который возвращает ответ JSON.

У меня есть функция JS getWorkflowRepositoryContent() кто вызывает этот webscript и возвращает данные в ответ.

Я храню response.json в массиве list,

У меня все отлично работает, но когда я звоню getWorkflowRepositoryContent() из другой функции js он возвращает пустой массив, когда должен вернуть массив, содержащий данные, полученные из 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;
}  

1 ответ

Решение

Ваш 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);
});

Вы также можете использовать обещания, но это может быть немного сложнее, если вы не знакомы с ними.

Другие вопросы по тегам