This is what the code below does:
- Goes to a table in a database and retrieves some search criteria I will send to Google API (the PHP file is getSearchSon.php) 
- After having the results, I want to loop around it, call the Google API (searchCriteriasFuc) and store the results in an array 
- The last part of the code is doing an update to two different tables with the results returned from Google API (updateSearchDb.php) 
In my code, I am using setTimeout in a few occasions which I don't like. Instead of using setTimeout, I would like to properly use callback functions in a more efficient way (This might be the cause of my problem) What is the best way of me doing that?
$(document).ready(function() {
    $.ajax({ 
        url: 'getSearchSon.php',  
        type: 'POST',
        async: true,
        dataType: 'Text',
        /*data: { }, */
        error: function(a, b, c) { alert(a+b+c); }  
    }).done(function(data) {
    if(data != "connection")
    {
        var dataSent = data.split("|");
        var search_criterias = JSON.parse(dataSent[0]);
        var date_length = dataSent[1];
        var divison_factor = dataSent[2];
        var length = search_criterias.length;
        var arrXhr = [];
        var totalResultsArr = [];
        var helperFunc = function(arrayIndex)
        {
            return function()
            {
                var totalResults = 0;
                if (arrXhr[arrayIndex].readyState === 4 && arrXhr[arrayIndex].status == 200) 
                {
                    totalResults = JSON.parse(arrXhr[arrayIndex].responseText).queries.nextPage[0].totalResults;
                    totalResultsArr.push(totalResults);
                }
            }
        }
        var searchCriteriasFuc = function getTotalResults(searchParam, callback) 
        {   
            var searchParamLength = searchParam.length;
            var url = "";
            for(var i=0;i<searchParamLength;i++)
            {
                url = "https://www.googleapis.com/customsearch/v1?q=" + searchParam[i] + "&cx=005894674626506192190:j1zrf-as6vg&key=AIzaSyCanPMUPsyt3mXQd2GOhMZgD4l472jcDNM&dateRestrict=" + date_length;
                arrXhr[i] = new XMLHttpRequest();
                arrXhr[i].open("GET", url, true);
                arrXhr[i].send();
                arrXhr[i].onreadystatechange = helperFunc(i);
            }
            setTimeout(function()
            {       
                if (typeof callback == "function")  callback.apply(totalResultsArr);
            }, 4000);
            return searchParam;
        }   
        function callbackFunction()
        { 
            var results_arr = this.sort();
            var countResultsArr = JSON.stringify(results_arr);
            $.ajax({
                url: 'updateSearchDb.php',  
                type: 'POST',
                async: true,
                dataType: 'Text',
                data: { 'countResultsArr': countResultsArr },
                error: function(a, b, c) { alert(a+b+c); }  
            }).done(function(data) {
                var resultsDiv = document.getElementById("search");
                if(data == "NORECORD") resultsDiv.innerHTML = 'Updated failed. There was a problem with the database';
                else resultsDiv.innerHTML = 'Update was successful';
            }); //end second ajax call
        }
        //llamando funcion principal
        var arrSearchCriterias = searchCriteriasFuc(search_criterias, callbackFunction);
    }
    else
    {
        alert("Problem with MySQL connection.");
    }
    }); // end ajax 
});
 
     
     
     
    