• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
0

Callback function in CF?

Guest
Sep 22, 2008 Sep 22, 2008

Copy link to clipboard

Copied

Is there a way to implement a callback function in CF?
The following pseudo callback function works by passing the function's name as a string.
Is there a way to pass a function pointer?

Output of the following code is: in callback function

Thank you in advance.
TOPICS
Advanced techniques

Views

786

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Sep 22, 2008 Sep 22, 2008

Copy link to clipboard

Copied

> Is there a way to pass a function pointer?

> <cffunction name="func">
> <cfargument name="arg1" type"string">
> <cfoutput>#Evaluate(arg1)#</cfoutput>
> </cffunction>
>
> <cffunction name="callback_func">
> in callback function
> </cffunction>
>
> <cfoutput>
> #func("callback_func()")#<br>
> </cfoutput>

Don't pass the function's name it, pass the function itself in:

{code}
<cffunction name="func">
<cfargument name="arg1" type="any"><!--- not really "any" but nothing more
appropriate to choose from --->
<cfoutput>#arguments.arg1()#</cfoutput>
</cffunction>

<cffunction name="callback_func">
in callback function
</cffunction>

<cfoutput>
#func(arg1=callback_func)#<br>
</cfoutput>

{code}

--
Adam

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guest
Sep 22, 2008 Sep 22, 2008

Copy link to clipboard

Copied

LATEST
Thanks Adam, that worked real well.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Valorous Hero ,
Sep 22, 2008 Sep 22, 2008

Copy link to clipboard

Copied

Adam Cameron wrote:
> Don't pass the function's name it, pass the function itself in:

Cool. Though it is probably worth noting the callback_function has to be in the same context (ie page or cfc).

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Sep 22, 2008 Sep 22, 2008

Copy link to clipboard

Copied

> Cool. Though it is probably worth noting the callback_function has to be in
> the same context (ie page or cfc).

I'm not sure I follow.

<!--- c1.cfc --->
<cfcomponent>
<cffunction name="f">
<cfreturn "This is F">
</cffunction>
</cfcomponent>

<!--- c2.cfc --->
<cfcomponent>
<cffunction name="g">
<cfargument name="func" type="any">
<cfreturn arguments.func()>
</cffunction>
</cfcomponent>

<!--- caller.cfm --->
<cfset copyF = createObject("component", "c1").f>
<cfset o = createObject("component", "c2")>
<cfoutput>#o.g(copyF)#</cfoutput>

This grabs the f() function out of c1, passes it to g() in c2, where it's
executed.

A function (UDF or CFC method) is pretty much just a variable in CF, and
can be passed around as such.

You *would* have a problem if f() referred to other methods or variables
within c1.cfc, because by the time you're running it, it's not the method
that is the member of an instance of C1; it's just "some ol' function". So
anything it *references* must be available in whichever scope it ends up
being.

--
Adam

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Valorous Hero ,
Sep 22, 2008 Sep 22, 2008

Copy link to clipboard

Copied

Adam Cameron wrote:

> You *would* have a problem if f() referred to other methods or variables
> within c1.cfc, because by the time you're running it, it's not the method
> that is the member of an instance of C1; it's just "some ol' function". So
> anything it *references* must be available in whichever scope it ends up
> being.

Yes, that is it exactly. So if c1.cfc contained this code, the call would fail because variables.someProperty is not in scope.

<cfcomponent>
<cfset variables.someProperty = "whatever">
<cffunction name="f">
<cfreturn variables.someProperty>
</cffunction>
</cfcomponent>

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
LEGEND ,
Sep 22, 2008 Sep 22, 2008

Copy link to clipboard

Copied

> <!--- not really "any" but nothing more
> appropriate to choose from --->

I take that back. Returntype="function" works fine.

--
Adam

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Resources
Documentation