Richard,

I've spent quite a bit of time figuring out #1 and #2 of your question list. I 
have a couple... URL intensive apps, and I used to get the "previous request" 
error all the time. Here's what I've learned through experimentation.

1. Blocking...

The PUT URL command is only blocking _within the context of the current 
handler_. You can think of it as if it was written like so in code:

get url "http://..."; WITH MESSAGES

Meaning that the current handler stops what it's doing waiting for the HTTP 
fetch to complete, but you can still resize the window, watch GIFs animate, and 
even click buttons.

2. Previous request errors...

You'll get these because of the behavior that PUT URL has (the fact that it 
allows messages to keep being processed). This behavior is actually a good 
thing, but means you need to be careful. 

For example, if you have a button that does a PUT URL on mouseUp, you can click 
that button many times really fast, and all of them will execute and yield in 
their handlers once they get to the PUT URL command. The first one will be in 
the process of fetching the URL when the second one hits the same line of code 
and trip the "previous request" error.

   ---

Now on to solutions...

I've found 2 solutions to this problem that appear to work best.

1. Use LOAD URL exclusively whenever you can. Sadly, this approach fails if you 
have to do any POST commands, because you can't perform a POST with a callback; 
it always acts like a PUT URL. This means the POST can fail. But, when it does 
fail, it fails instantly, you know it failed, and you can try again immediately.

2. Don't trust the LOAD URL message queue that Rev comes with built-in. Sadly, 
while their message queue for loading URLs is just fine, it doesn't let you 
inspect it (you can't tell if a URL is currently being loaded, what it is, or 
what the status of it is). Instead, roll your own. This also has the nice 
ability of being able to debug easily:

global gHttpCmdQ

on postHttpCmd pAction, pURL, pTarget, pCallback
        get gHttpCmdQ is empty

        ## insert the command onto the queue to be processed later
        put pAction & tab & pURL & tab & pTarget & tab & pCallback & cr after 
gHttpCmdQ

        ## if there were no commands on the queue, process this new one now
        if it is true then
                processHttpCmds
        end if
end postHttpCmd

on processHttpCmds
        local tAction
        local tURL
        local tTarget
        local tCallback

        get the first line of gHttpCmdQ

        if it is empty then
                exit processHttpCmds
        end if

        ## pop the command off the queue
        delete the first line of gHttpCmdQ

        set the itemDelimiter to tab

        put item 1 of it into tAction
        put item 2 of it into tURL
        put item 3 of it into tTarget
        put item 5 of it into tCallback

        switch tAction
                case "GET"
                        get URL tURL
                        break
                case "POST"
                        post ...
                        break
                ## more command types here
        end switch

        if the result is not empty then
                dispatch tCallback to tTarget with "error" , the result
        else
                dispatch tCallback to tTarget with "cached" , it
        end if

        ## continue processing messages from the queue
        send "processHttpCmds" to me in 0 seconds
end processHttpCmds

   ---

Anyway, I use something very similar in my apps and I have yet to run into any 
problems. YMMV, though.

HTH,

Jeff M.


On Mar 11, 2010, at 7:23 AM, Richard Gaskin wrote:

> While working with Dan Friedman to diagnose some FTP issues, he came up with 
> some questions I couldn't answer so I'm bringing them to y'all to see what we 
> can find:
> 
> 1. Is "put url..." a blocking command?
>   I believe it's supposed to be, but find I can sometime do other
>   things while it's running, including submitting subsequent
>   "put url..." commands.
> 
> 2. In such a circumstance, the second attempt to "put url..."
>   meets with an error, "Previous request not completed."  I've
>   found that once that error hits the original request sometimes
>   runs into trouble, requiring me to use libUrlResetAll and
>   try again.  Is there a more graceful way to handle that error?

_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to