OK.  If you want to pursue further, examine the actual transpiled code to make 
sure it build the closures properly.

FWIW, I've never used Promises, but I've never been a fan of function objects 
and would be tempted to use closures instead of functions.  I think avoiding 
function objects might future-proof your code as the JS and/or AS scope chain 
isn't guaranteed to be available on other platforms/runtimes/languages.  IOW, I 
would have defined a callback method closure like this:

    private function somePromiseHandler():void    {
       appendProgressTextWithString(PanelStrings.PACKAGING + "...");
       setTimeout(doPackage,50);
   }

    private function handlePackage():void{
        returnSomePromise().then(somePromiseHandler);
    }

This should work, is easier for me to read, and avoids reliance on scope chains.

My 2 cents,
-Alex

On 12/3/18, 1:02 PM, "Harbs" <[email protected]> wrote:

    Here’s some pseudocode which helps explain better:
    
    
    private function handlePackage():void{
        var that:PackagePanel = this;
        returnSomePromise().then(function(result:*):*{
                appendProgressTextWithString(PanelStrings.PACKAGING + "...");
                setTimeout(function():*{that.doPackage()},50);
        });
    }
    
    I need to delay the running of doPackage() to allow for UI to update 
(without getting into the reason for that necessity). That’s why I’m calling 
setTimeout().
    
    The function is resolved inside a Promise resolution which messed up this 
and self. I don’t remember the details offhand. I wrote this code some time ago.
    
    I actually just tried removing “that” and it seemed to work, so I’m not 
sure what the issue was at the time...
    
    Harbs
    
    > On Dec 3, 2018, at 7:38 PM, Alex Harui <[email protected]> wrote:
    > 
    > I'm not sure I understand.
    > 
    > The compiler is supposed to generate a closure for any parameters of type 
function.  Is it not doing that?  In ActionScript, you shouldn't need to mess 
with this/that/self.  I have not looked at any of the code involved, but 
assuming you are calling something defined like this:
    > 
    > public function setTimeout(fn:Function):void
    > 
    > Then the ActionScript for SWF should work like this:
    > 
    > Public class MyClass
    > {
    >   Public function MyClass()
    >   {
    >       setTimeout(myPrivateFunction);
    >   }
    >   private function myPrivateFunction():void
    >   {
    >   }
    > }
    > 
    > The Transpiler should then generate:
    > 
    > MyClass = function() {
    >    
setTimeout(org.apache.royale.utils.Language.closure(MyClass_myPrivateFunction, 
this, "myPrivateFunction");
    > }
    > 
    > MyClass.prototype.MyClass_myPrivateFunction = function() {};
    > 
    > And it should all work just fine.  If it isn't, start at the beginning 
and make sure the param for setTImeout is a Function and not an Object or *.  
And see if the Transpiler generated the call to Language.closure.
    > 
    > HTH,
    > -Alex
    > 
    > 
    > On 12/3/18, 2:53 AM, "Harbs" <[email protected]> wrote:
    > 
    >    I just spent a long time tracking down a bug:
    > 
    >    I needed to delay execution of a private method called “doPackage()”. 
Because of “this” weirdness, I used “that” as a reference:
    >    setTimeout(function():*{that.doPackage()},50);
    > 
    >    And declared this as that:
    >    var that:* = this;
    > 
    >    The problem is that “doPackage” is now a fully qualified so doPackage 
is not defined.
    >    The solution is to declare the type of that like so:
    >    var that:PackagePanel = this;
    > 
    >    I’m not sure if there’s a way to resolve this better.
    > 
    >    Harbs
    > 
    > 
    > 
    
    

Reply via email to