6 Replies Latest reply on Sep 22, 2008 7:13 PM by wolfv

    Callback function in CF?

    wolfv
      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.
        • 1. Re: Callback function in CF?
          Level 7
          > 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
          • 2. Re: Callback function in CF?
            -==cfSearching==- Level 4
            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).
            • 3. Re: Callback function in CF?
              Level 7
              > 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
              • 4. Re: Callback function in CF?
                Level 7
                > <!--- not really "any" but nothing more
                > appropriate to choose from --->

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

                --
                Adam
                • 5. Re: Callback function in CF?
                  -==cfSearching==- Level 4
                  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>
                  • 6. Re: Callback function in CF?
                    wolfv Level 1
                    Thanks Adam, that worked real well.