function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
SaraHasNoLimitsSaraHasNoLimits 

Can you fire an application event in a callback function?

Is it possible to fire off an application event from a callback function? 

For example, could I do something like this"

createNewRace : function(component) {
        
        var race = component.get("v.newRace");
        this.insertRace(component, race, function(a) {
            console.log("Race successfully saved");
            var updateRace = $A.get("e.c:updateRaces");
            updateRace.setParams({ "race" : race });
            updateRace.fire(); 
        });
    },
    insertRace : function(component, race, callback) {
        var action = component.get("c.newRaceDB");
        action.setParams({ "race" : race });
        if (callback) {
            action.setCallback(this, callback);
        }
        $A.enqueueAction(action);
    }
Best Answer chosen by SaraHasNoLimits
SaraHasNoLimitsSaraHasNoLimits
I finally figured out what the problem was here. The app event was not firing becasue the handler had a name attribute, like this:

<aura:handler name="updateRaces" event="c:updateRaceList" action="{!c.handleUpdateRaces}" />

Once I removed that and made it look like this, everything worked like it was supposed to:

<aura:handler event="c:updateRaceList" action="{!c.handleUpdateRaces}" />

All Answers

SaraHasNoLimitsSaraHasNoLimits
I have changed my code several times trying to see if I can make this work and I am thinking that the framework os not going to allow me to do this, but I would love for someome to tell me if there is another way to accomplish. Essentially I want to be able to fire off an application event in the callback for an action. At first I thought maybe it was not working because the fire was happening in a helper method, so I moved all the code back into the controller, but my application even is still never firing. Here is the controller code:

({
    doInit : function(component, event, helper) {
        console.log("Calling loadOption");
        helper.loadOptions(component);
    },
    newRace : function(component, event, helper) {
        console.log("In newRace");
        var race = component.get("v.newRace");
        var action = component.get("c.newRaceDB");
        action.setParams({ "race" : race });
        action.setCallback(this, function(response) {
            var state = response.getState();
            if (component.isValid() && state === "SUCCESS") {
                console.log("Race successfully saved");
                var appEvent = $A.get("e.c:updateRaceList");
                appEvent.setParams({ "race" : response.getReturnValue() });
                appEvent.fire(); 
            }
        });
        $A.enqueueAction(action);
       
    }   
})

And this is the NewRace component:
<aura:component implements="force:appHostable,flexipage:availableForAllPageTypes" controller="NewRaceController">
    <aura:attribute name="newRace" type="Race__c"
         default="{ 'sobjectType': 'Race__c',
                         'Name': 'New Race',
                         'Type__c': '',
                         'DateTime__c': '', 
                         'Location': '',
                         'Attended__c': false,
                           'Results__c': ''
                       }"/>
    <aura:handler name="init" value="{!this}" action="{!c.doInit}" />
    <aura:registerEvent name="updateRaceList" type="c:updateRaceList" />
    
    <ltng:require styles="/resource/slds/assets/styles/salesforce-lightning-design-system.min.css"/>
    
    <div class="slds">
        <div class="slds-m-around--small slds-p-top--large">
            <div class="slds-form--stacked">
               <h1 class="slds-text-heading--label slds-p-bottom--large" 
                   title="Enter New Race">Enter New Race</h1>
                
                <div class="slds-form-element">
                    <div class="slds-form-element__control">
                        <ui:inputText label="Race Name" 
                                      aura:id="Name"
                                      class="slds-input" 
                                      labelClass="slds-form-element__label" 
                                      value="{!v.newRace.Name}"
                                      required="true" />
                    </div>
                </div>
                
                <div class="slds-form-element">
                    <div class="slds-form-element__control">
                        <ui:inputSelect label="Race Type" 
                                        aura:id="Type" 
                                        class="slds-select" 
                                        labelClass="slds-form-element__label"
                                        value="{!v.newRace.Type__c}" />
                    </div>
                </div>
                
                <div class="slds-form-element">
                    <div class="slds-form-element__control">
                        <ui:inputDateTime label="Date/Time" 
                                          aura:id="DateTime" 
                                          class="slds-input" 
                                          labelClass="slds-form-element__label" 
                                          displayDatePicker="true"
                                          value="{!v.newRace.DateTime__c}" />
                    </div>
                </div>
                
                <div class="slds-form-element">
                    <div class="slds-form-element__control">
                        <ui:inputTextArea label="Location" 
                                          aura:id="Location"
                                          class="slds-textarea" 
                                          labelClass="slds-form-element__label"
                                          value="{!v.newRace.Location__c}" />
                    </div>
                </div>
                
                <div class="slds-form-element">
                    <div class="slds-form-element__control">
                        <ui:inputCheckbox label="Attended?" 
                                          aura:id="Attended"
                                          class="slds-checkbox" 
                                          labelClass="slds-form-element__label"
                                          value="{!v.newRace.Attended__c}" />
                    </div>
                </div>
                
                <div class="slds-form-element">
                    <div class="slds-form-element__control">
                        <ui:inputText label="Results" 
                                      aura:id="Results"
                                      class="slds-input" 
                                      labelClass="slds-form-element__label"
                                      value="{!v.newRace.Results__c}" />
                    </div>
                </div>
                
                <div class="slds-form-element">
                    <ui:button press="{!c.newRace}" 
                               label="Submit" 
                               class="slds-button slds-button--neutral" />
                </div>
            </div>
        </div>
    </div>
    
</aura:component>

And this is the event:
<aura:event type="APPLICATION">
    <aura:attribute name="race" type="Race__c" />
</aura:event>
SaraHasNoLimitsSaraHasNoLimits
I finally figured out what the problem was here. The app event was not firing becasue the handler had a name attribute, like this:

<aura:handler name="updateRaces" event="c:updateRaceList" action="{!c.handleUpdateRaces}" />

Once I removed that and made it look like this, everything worked like it was supposed to:

<aura:handler event="c:updateRaceList" action="{!c.handleUpdateRaces}" />
This was selected as the best answer