Evitar que la llamada jQuery AJAX envíe datos de formulario dos veces

Tengo problemas para evitar que se envíe la llamada ajax de jqueryformar datos dos veces.

El formulario tiene dos campos:

<form id="calendarform_id" method="post" onsubmit="find_schedule()" action="/find_data">
    <input id="date1" type="text" required="" name="d_date1">
    <input id="date2" type="text" required="" name="d_date2">
</form>

El javascript que hace la llamada ajax es:

function get_form_data_uid($form){
    var form_data_array = $form.serializeArray();
    var form_array = {};

    $.map(form_data_array, function(n, i){
        form_array[n['name']] = n['value'];
    });

    form_array['uid'] = localStorage.getItem('uid');

    return form_array;
}

function find_schedule()
{

    var uri, method, formId, $form, form_data;

    uri = location.protocol + '//' + location.host + "/find_schedule";
    method = "POST";
    formId = "#calendarform_id";

    $form = $(formId);
    form_data = get_form_data_uid($form);

    // Set-up ajax call
    var request = {
        url: uri,
        type: method,
        contentType: "application/json",
        accepts: "application/json",
        async: false,
        cache: false,
        dataType: 'json',
        data:  form_data
    };

    $(formId).submit(function(e){
        e.preventDefault();
        e.stopImmediatePropagation();
        // Make the request
        $.ajax(request).done(function(data) { // Handle the response
            alert(data.message);
        }).fail(function(jqXHR) { // Handle failure
                console.log("ajax error upon looking up schedule " + jqXHR.status);
            }
        );
        return false;
    });
}

Al observar las solicitudes realizadas al servidor, veo que no hay un campo uid. También he intentado colocar el código recuperando los datos del formulario y la identificación del usuario (uid), así como la variable de solicitud dentro del controlador de envío, pero el uid aún no se ha enviado.

¿Por qué?

Editar:

Eliminé el campo de envío del formulario y moví el controlador de envío fuera de la función:

Código javacript actualizado:

$("#calendarform_id").submit(function(e){
        var uri, method, formId, $form, form_data;

        uri = location.protocol + '//' + location.host + "/find_schedule";
        method = "POST";
        formId = "#calendarform_id";

        $form = $(formId);
        form_data = get_form_data_uid($form);

        // Set-up ajax call
        var request = {
            url: uri,
            type: method,
            contentType: "application/json",
            accepts: "application/json",
            async: false,
            cache: false,
            dataType: 'json',
            data:  form_data
        };
        // Prevent implicit submit
        e.preventDefault();
        e.stopImmediatePropagation();
        // Make the request
        $.ajax(request).done(function(data) { // Handle the response
            alert(data.message);
        }).fail(function(jqXHR) { // Handle failure
                console.log("ajax error upon looking up schedule " + jqXHR.status);
            }
        );
        return false;
    });

Editar # 1:

He agregado el uid como campo oculto al formulario:

<form id="calendarform_id" method="post" action="/find_data">
        <input id="date1" type="text" required="" name="d_date1">
        <input id="date2" type="text" required="" name="d_date2">
        <input id="user_id" type="hidden" name="uid" value="<token_from_local_storage>">
</form>

Por alguna razón, aparentemente no puedo depurar el código que está dentro del controlador .submit; tampoco se muestra una alerta simple.

Respuestas a la pregunta(0)

Su respuesta a la pregunta