Methods in Lightning components do not return a value, also came to the same outcome as yourself.
However, I did learn to use and love component events with dynamic event handlers. What you can do from the calling component is fire a component event from within the component you wish to call the method on currently and attach a dynamic event handler for the component finishes processing.
So for example, you can fire an event from where you want to fire the method now like so:
otherComponent.getEvent('provide').fire();
Then also attach a dynamic event handler to listen for a response:
otherComponent.addHandler('responseEvent', component, 'c.handlingControllerAction');
The approach has the benefit of decoupling your components and if you need your other component to do asynchronous work then you can as also the response event would be fired asynchronously. It also allows multiple components to listen out for this event and also react accordingly.
Find more information on the Salesforce help:
https://developer.salesforce.com/docs/atlas.en-us.lightning.meta/lightning/js_cb_dynamic_handler.htm
Hope this helps!
The bug in your code is at <aura:handler name="refineList" action="{! c.refineList}" event="c:contactListSearchFormEvent"/>
- you must use same name that you gave in registered event
<aura:handler name="searchContact" action="{! c.refineList}" event="c:contactListSearchFormEvent"/>
The name attribute in <aura:handler>
must match the name attribute in the <aura:registerEvent>
tag in the component that fires the event.
Best Answer
As the documentation says:
Using aura:method to communicate to the parent means that multiple listeners are not possible (adding a new listener would "bump" the old listener off without warning). Using aura:method to communicate downwards means that the parent must notify the child of changes, as opposed to using an aura:valueChange event, which means the parent can simply set an attribute and as many child components as necessary are notified automatically.
In other words, it causes undue complications that could be avoided by using component or application events. That's not to say you can't use aura:method, but you should consider it a last resort after using events. The only time when aura:method is really useful is when the child component wants to return a value. Service components are an example of this design. While relatively rare, there are times when aura:method is appropriate. However, you should get used to using components as the preferred method of communication.