How does one return data to the original caller function in Javascript?

前端 未结 5 2125
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-18 15:42

I have a problem returning data back to the function I want it returned to. Code below:

function ioServer(request_data, callback)
{
    $.ajax({
        cach         


        
相关标签:
5条回答
  • 2020-12-18 15:56

    Since this is an asynchronous request, it does not directly return a value like that and it isn't possible.

    The way to approach this is to have some method which performs any actions you need on the fetched data, instead of attempting to have a return value which will not work.

    0 讨论(0)
  • 2020-12-18 16:05

    I think maybe this is closer to what you are looking for...

    function ioServer(request_data, callback)
    {
        $.ajax({
            cache: false,
            data: "request=" + request_data,
            dataType: "json",
            error: function(XMLHttpRequest, textStatus, errorThrown){},
            success: function(response_data, textStatus){
                    processResponse(response_data, callback);
                    },
            timeout: 5000,
            type: "POST",
            url: "/portal/index.php/async"
        });
    }   
    
    function processRequest(command, item, properties, callback)
    {
        var request = {};
        request.command = command;
        request.item = item;
        request.properties = properties;
        var toServer = JSON.stringify(request); 
        ioServer(toServer, callback);
    }
    
    //internal callback to handle response code
    function processResponse(fromServer, callback)
    {
        if (fromServer.response == 1)
        {
            //call the callback with the id
            callback(fromServer.id);   
        }   
        else
        {
            //You have to remember to call the callback no matter what
            //or the caller won't know when it's complete
            callback(null);  //or some other "didn't get a valid response" value
        } 
    }
    
    0 讨论(0)
  • 2020-12-18 16:06

    Awesome! Thank you guys for the help, it works like a charm now. And I've learned to use callbacks better. Here's the full working code:

    createTab('#tabs'); // I'm using JQuery UI to handle tabs    
    
    function createTab(parent_element){
                var name = {};
                name.name = "New tab";
                var position = {};
                position.position = $(parent_element).tabs('length') + 1;
                var properties = new Array();
                properties[0] = name;
                properties[1] = position;
                processRequest(1, 1, properties, 
                          function(id)
                          {
                             if(id == null) 
                             {
                                  alert('There is a problem!');
                                  return;
                             }
                             $('#tabs').tabs('add', '#tab-' + id, 'New tab');
                          });
            }
    
    function ioServer(request_data, callback)
    {
        $.ajax({
            cache: false,
            data: "request=" + request_data,
            dataType: "json",
            error: function(XMLHttpRequest, textStatus, errorThrown){},
            success: function(response_data, textStatus){
                    processResponse(response_data, callback);
                    },
            timeout: 5000,
            type: "POST",
            url: "/portal/index.php/async"
        });
    }   
    
    function processRequest(command, item, properties, callback)
    {
        var request = {};
        request.command = command;
        request.item = item;
        request.properties = properties;
        var toServer = JSON.stringify(request); 
        ioServer(toServer, callback);
    }
    
    //internal callback to handle response code
    function processResponse(fromServer, callback)
    {
        if (fromServer.response == 1)
        {
            //call the callback with the id
            callback(fromServer.id);   
        }   
        else
        {
            //You have to remember to call the callback no matter what
            //or the caller won't know when it's complete
            callback(null);  //or some other "didn't get a valid response" value
        } 
    }
    

    And it adds a new tab at the end of the list in the page. This is now also stored server-side with PHP and MySQL, just like I wanted it.

    Thanks again!

    0 讨论(0)
  • 2020-12-18 16:16

    Instead of implementing blocking to simulate a synchronous call like someone else previously posted, just make the AJAX call itself synchronous and update your success wrapper:

    function ioServer(request_data, callback) {
        var response = null;
        $.ajax({
            cache: false,
            data: "request=" + request_data,
            dataType: "json",
            error: function(XMLHttpRequest, textStatus, errorThrown){},
            success: function(response_data, textStatus) {
                    response = callback(response_data);
            },
            timeout: 5000,
            type: "POST",
            url: "/portal/index.php/async",
            async: false
        });
    
        return response;
    }
    

    Edit: Although useful, this is sorta against the grain of "normal" AJAX use. I would suggest changing your approach instead.

    0 讨论(0)
  • 2020-12-18 16:21

    As Tony didn't provide any comments, let me add details about what he is suggesting.

    As you have learned, the processRequest function completes as soon as $.ajax call is made because $.ajax method is asynchronous. So how would you notify the caller of processRequest that the task is done?

    Simple, you ask that the caller of processRequest to supply a 'callback function'. The processRequest will call this function whenever it has received the ajax output. In tony's code, this is the last argument to the processRequest function.

    So your calling code will now look like

    function tabMethod() {
        processRequest('command', 'item', 'properties',
            function (id) {
                if (id == null) {
                    alert('There is a problem!');
                    return;
                }
                $('#tabs').tabs('add', '#tab-' + id, 'New tab');
            });
    };
    
    0 讨论(0)
提交回复
热议问题