I was reading through Future Method Documentation and found that you can only return void type with this method, is there any particular reason that method returns void type ?
-
1Answer is simple because it is asynchronous process.. For example if you run future method from synchronous process then you can't wait to complete asynchronous process and get that value from asynchronous process in trigger context..– Ratan PaulCommented Mar 5, 2016 at 10:55
-
How on earth do you expect a synchronous process to get a return from an asynchronous process. Have your main process just run for days?– Jesse MilburnCommented Mar 5, 2016 at 19:41
-
The @future methods can only have primitive data types (or collections of them) for their input parameters. As they run at a future time from when they are called, they have nowhere to return a response and thus can only return a void type. Other than this and the fact that there is a limit as to how many future methods can be invoked at any one time, they look and behave like any other method.– Andy HitchingsCommented Apr 25, 2016 at 16:28
2 Answers
Future methods will run in the future. You don't want your synchronous code waiting an unknown period of time for an asynchronous bit of code to finish working.
The whole point is you want to clearly separate what happens now from what happens in the future.
By only returning void, you can't have code that waits for a result.
It's also why you can only pass Ids and primitives as parameters. It's assumed the future method will execute at an unknown time in the future, so if you need database records you'll need to re-query the data to ensure it's fresh.
-
1You can pass any primitive or collection thereof, not just Id.– Adrian Larson ♦Commented Mar 5, 2016 at 14:49
-
Sorry, that's what happens when you post after a few beers :) Updated the answer accordingly.– Nick CCommented Mar 5, 2016 at 22:49
(I can't add a comment under Nick as my rep is low, but...)
To add to Nick Cook's answer,
There is a relatively new interface in Salesforce (Oct '14?), Queueable, which works the same as @future. That is, the platform queues up a process when the line of code is executed, and runs it at a later time in a separate execution.
Some key differences, and reasons why you should know about Queueable as well as @future -
- A queueable process can queue another queueable, or launch an @future. Future methods cannot call future methods
- Future methods can queue queueables
- You can pass in non-primitive data types when you create a queueable object
This can be useful for either of the following -
- You need to recreate some multi-step process - for example, something that may require a rolling refresh through the UI, as a non-UI process
- You need a stateful queued process. For example, you can construct a queueable with your current controller and when the queued process starts, it already has the state of the controller at the time you queued the process
Here's more info about Queueables: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_queueing_jobs.htm
Note: With a little Apex Magic, you could have a future handler class which delegates between @future and Queueable, and using this class you can always make a callouut or queue another future process. As far as I can see, this requires that you pass information as primitive data.
Note2: Queueable itself is not always able to make callouts, so to fully leverage, you'll need both Queueables and @futures.
-
Can we make call out to external web service through Queueable interface ?– MIX DMLCommented Mar 6, 2016 at 4:12
-
3@PrabhatKumar yep just implement
Database.AllowCallouts
.– Adrian Larson ♦Commented Mar 6, 2016 at 14:35