<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://www.dotnetzone.gr:443/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>ASP.NET &amp; AJAX</title><link>https://www.dotnetzone.gr:443/cs/forums/170/ShowForum.aspx</link><description>Θέματα για web εφαρμογές που έχουν σχέση με AJAX τεχνολογίες</description><dc:language>el</dc:language><generator>CommunityServer 2.1 SP3 (Build: 20423.1)</generator><item><title>Απ: My JavaScript waitForEvent() nightmares ....</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/49971.aspx</link><pubDate>Thu, 09 Apr 2009 01:26:40 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:49971</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/49971.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=170&amp;PostID=49971</wfw:commentRss><description>Κι άκου τώρα πράματα ... πλέον λέει το setTimeout παίρνει ως πρώτη παράμετρο και ένα function, αρκεί να μην έχει παραμέτρους ... :P ... magic ... magic ... &lt;br&gt;[&lt;i&gt; ε ρε τι τραβάμε οι 30+ που μάθαμε στοn Ι.Ε. 3 και Netscape Navigator ... όλα τα καλά τους δίνουν τώρα ! &lt;/i&gt;]&lt;br&gt;</description></item><item><title>Απ: My JavaScript waitForEvent() nightmares ....</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/49925.aspx</link><pubDate>Tue, 07 Apr 2009 19:28:36 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:49925</guid><dc:creator>PALLADIN</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/49925.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=170&amp;PostID=49925</wfw:commentRss><description>&lt;FONT size=1&gt;
&lt;P&gt;&lt;FONT size=2&gt;Καλησπέρα φιλε Άγγελε...&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;Διαβάζοντας το post σου, μου ήρθε στο μυαλό το παράδειγμα από το Wizard Book για discrete event simulation. Και σκέφτηκα ότι είναι καλή ευκαιρία να δώσω ένα link προς το άλλο σύμπαν &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;FONT color=#800080 size=2&gt;&lt;A href="http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-22.html#%_sec_3.3.4"&gt;A Simulator for Digital Circuits&lt;/A&gt;&lt;/FONT&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=2&gt;Keep up the good code&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;</description></item><item><title>My JavaScript waitForEvent() nightmares ....</title><link>https://www.dotnetzone.gr:443/cs/forums/thread/49915.aspx</link><pubDate>Tue, 07 Apr 2009 01:27:24 GMT</pubDate><guid isPermaLink="false">2622095e-976c-431a-859e-16783ec7ecd7:49915</guid><dc:creator>anjelinio</dc:creator><slash:comments>0</slash:comments><comments>https://www.dotnetzone.gr:443/cs/forums/thread/49915.aspx</comments><wfw:commentRss>https://www.dotnetzone.gr:443/cs/forums/commentrss.aspx?SectionID=170&amp;PostID=49915</wfw:commentRss><description>Κι άκου τώρα τί παθαίνει ο άνθρωπος αν μπλέξει με ... μπελάτες ... &lt;br&gt;&lt;br&gt;Υπάρχει μια σελιδούλα που λέτε, η οποία κάνει περιοδικά AJAX refresh calls στον εαυτό της, κάνοντας monitor το status μιας δουλειάς που τρέχει στο server. &lt;br&gt;&lt;br&gt;Αυτό το job στο server λοιπόν, που και πού δίνει πίσω warnings ( &lt;i&gt;κατά τη διάρκεια της λειτουργίας του, όχι μόνο στο τέλος της&lt;/i&gt; ), κι όταν με το καλό τελειώσει, πρέπει τότε να εκτελεστεί κάτι άλλο, κι αυτό όμως ξεκινάει στο UI. &lt;br&gt;&lt;br&gt;Τα warnings λοιπόν, φαίνονταν στην αρχή με alert boxes. Μετά όμως, επειδή ο μπελάτης δε γούσταρε γκρί pop-ups που του χαλάγανε την αισθητική ( &lt;i&gt;κι αν δεν πατήσεις και οκ μπλοκάρουν το browser ο οποίος περιμένει να πατήσεις το οκ ... οπότε πάνε τα ajax refreshes ...&lt;/i&gt; ), πετάγονταν σε ένα ψευτο-pop-up με ένα div-άκι όμορφούλι. &lt;br&gt;&lt;br&gt;Μια χαρά ως εδώ ... αλλα το div-άκι ήταν .. singleton ! Οπότε, μόλις του λες "&lt;i&gt;δείξε αυτό&lt;/i&gt;", δείχνει ... αυτό, κι αν στα καπάκια του πείς "&lt;i&gt;δείξε κάτι άλλο&lt;/i&gt;", τότε δείχνει κάτι άλλο. &lt;br&gt;&lt;br&gt;"&lt;i&gt;Α ... δεν το θέλω αυτό ... &lt;/i&gt;" λέει ο κακός μπελάτης&amp;nbsp; ... "&lt;i&gt; γιατί εξαφανίζεται προτού διαβάσω το μήνυμα λάθους και πατήσω το κίτρινο 'οκ' ... &lt;/i&gt;" ... και κλάμα εμείς, γιατί το ένα χαλάει τα refresh, το άλλο χαλάει ... τον πελάτη &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-2.gif" alt="Big Smile" /&gt;&lt;br&gt;&lt;br&gt;Καίγοντας λίγο το μυαλό μου, σκέφτηκα το εξής. Αυτο που ήθελα στην πραγματικότητα, ήταν ένας τρόπος - σε Javascript - να μην εκτελείται μια κλήση μου, αν πρώτα δεν έχει γίνει κάτι άλλο. Κι αυτό, χωρίς να μπλοκάρω το browser, ώστε να τρέχουν και τυχόν άλλα scripts παράλληλα. ( &lt;i&gt;¨ενα while loop απο την άλλη, μπορεί επίσης να στείλει τη CPU σας στο ... 500% πολύ γρήγορα στον I.E. &lt;/i&gt;)&lt;br&gt;&lt;br&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; . . . &lt;br&gt;&lt;br&gt;Άντε, λέω ... ένα while ( !myCondition ) setTimeout( callMeAgain ) είναι, τίποτα σπουδαίο. &lt;br&gt;&lt;br&gt;Και μετά τρώς τη συνειδητοποίηση. Το setTimeout παίρνει το script που είναι να τρέξει ως string. Εγώ όμως έχω παραμέτρους για την κλήση μου, οι οποίες δεν είναι σε global scope, δε μπορώ να κάνω eval ένα script με τα ονόματά τους μέσα !!! Κλάμμαααααα ..... &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-9.gif" alt="Crying" /&gt;&lt;br&gt;&lt;br&gt;Οπότε; Τι κάνεις τώρα; &lt;br&gt;&lt;br&gt;Μετά απο λίγη σκέψη ακόμα λοιπόν, κατέληξα στο εξής όμορφο ... &lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// I'm planning to store the "when" and the "callthis" functions here, under a unique key. &lt;/span&gt;
&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;var&lt;/span&gt; _executeWhenMap &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt;  { };

&lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/*
    Executes funcToExecute only after funcWhen returns true, otherwise
    it will wait for a few millis, and try again. 
*/&lt;/span&gt;
&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;function&lt;/span&gt; ExecuteWhen(funcToExecute, funcWhen) {
    &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/*  ok, what I want to do is this:

        If my when() function returns FALSE, I'm building a little struct with the
        when() and toExecute() functions, ans store it in the global executeWhenMap[] under a unique key.
        
        Then, I just setTimeout(...) executeWhenInternal, with the key as the argument ;)
    */&lt;/span&gt;
    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt;(funcWhen())
        funcToExecute();
    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt; {
        &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// create my little ExecuteInfo here ...  &lt;/span&gt;
        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;var&lt;/span&gt; executeInfo &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; { &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"When"&lt;/span&gt;:funcWhen, &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Do"&lt;/span&gt;:funcToExecute };
        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;var&lt;/span&gt; myUniqueKey &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; (new &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;Date&lt;/span&gt;()).&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;getMilliseconds&lt;/span&gt;().&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;toString&lt;/span&gt;();
        
        _executeWhenMap[myUniqueKey] &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; executeInfo;
        
        setTimeout(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"ExecuteWhenInternal('"&lt;/span&gt; &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; myUniqueKey &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"');"&lt;/span&gt;, 10);
    }
}

&lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;/*
    Queries the executionMapStack thingy for a given executionInfo key,
    and does the .. if(when()) do() else setTimeout(executeWhenInternal(myOriginalKey), 10 ) thing ... and God be with us ... 
*/&lt;/span&gt;
&lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;function&lt;/span&gt; ExecuteWhenInternal(strExecuteInfoKey){
    &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// ok, na doume an exw eceuteInfo gia ayto to key edw ...&lt;/span&gt;
    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;var&lt;/span&gt; executeInfo &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; _executeWhenMap[strExecuteInfoKey];
    &lt;span style="color:Green;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;// exw ???&lt;/span&gt;
    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt;(null == executeInfo || &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"undefined"&lt;/span&gt; == typeof(executeInfo)) 
        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;throw&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"ExecutionInfo for Key: "&lt;/span&gt; &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; strExecuteInfoKey &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;" was not found in the execution map"&lt;/span&gt;;
    &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt; {
        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;var&lt;/span&gt; funcWhen &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; executeInfo.When;
        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;var&lt;/span&gt; funcToCall &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; executeInfo.Do;
        
        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;if&lt;/span&gt;(funcWhen()){
            funcToCall();
            _executeWhenMap[strExecuteInfoKey] &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; null;
        } &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;else&lt;/span&gt;
            setTimeout(&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"ExecuteWhenInternal('"&lt;/span&gt; &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; strExecuteInfoKey &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;+&lt;/span&gt; &lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"');"&lt;/span&gt;, 10);
    }
}&lt;/span&gt;&lt;/pre&gt;Τι κάνει τώρα τούτο δώ ... στην πραγματικότητα, κάνει αυτό που δεν κάνει η&amp;nbsp; JavaScript απο μόνη της. Κάνει τη μέθοδο που θέλα να εκτελέσω, μαζί με τη μέθοδο η οποία ελέγχει αν μπορώ να την εκτελέσω ... global, και string-addressable. &lt;br&gt;&lt;br&gt;Υπάρχει δηλαδή ένα Dictionary στη μνήμη, το οποίο δέχεται entries βάσει ενός string key, τα οποία περιέχουν τις 2 μεθόδους, τη "when" μέθοδο ( μπορώ να εκτελέσω τον κώδικά μου τώρα; ), και τη μέθοδο που τελικά θέλω να εκτελεστεί ( αυτό είναι ο κώδικας που ήθελα να εκτελέσω απ'την αρχή ... ). &lt;br&gt;&lt;br&gt;Έτσι, μπορώ να κάνω setTimeout, και μέσα εκεί να βλέπω αν πρέπει να εκτελέσω ακόμα ή να περιμένω, και να πράξω πλέον τα απαραίτητα execute ή setTimeout στον εαυτό μου για αργότερα.&lt;br&gt;&lt;br&gt;Το δοκίμασα σε μια html σελίδα με 2 κουμπάκια. Το πρώτο κάνει ένα απλό alert('hello'). Το δεύτερο ανοίγει και κλείνει μια boolean μεταβλητή. Θέλω τα alert να εκτελεστούν, μόνο αν η boolean είναι "ανοιχτή". Αλλιώς, θα εκτελεστούν αν και όταν ανοίξει ποτέ αυτή η boolean !&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;span style="color:Black;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;&amp;lt;html xmlns=&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"http://www.w3.org/1999/xhtml"&lt;/span&gt;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Untitled Page&amp;lt;/title&amp;gt;
    &amp;lt;script type=&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"text/javascript"&lt;/span&gt;&amp;gt;
    
        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;var&lt;/span&gt; _continue &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; false;
        
        &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;function&lt;/span&gt; CanIContinue() {
            &lt;span style="color:Blue;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;return&lt;/span&gt; _continue;
        }
        
        window.status &lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;=&lt;/span&gt; !_continue;
        
    &amp;lt;/script&amp;gt;
    &amp;lt;script type=&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"text/javascript"&lt;/span&gt; src=&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"ExecuteAfter.js"&lt;/span&gt; &amp;gt; &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;&lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;input&lt;/span&gt; type=&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"button"&lt;/span&gt; value=&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Start/End Blocking"&lt;/span&gt; onclick=&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"_continue = !_continue; window.status = !_continue;"&lt;/span&gt; /&amp;gt;
    &amp;lt;&lt;span style="color:Red;background-color:transparent;font-family:Courier New;font-size:11px;font-weight:normal;"&gt;input&lt;/span&gt; type=&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"button"&lt;/span&gt; value=&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"Try alert('hello');"&lt;/span&gt; onclick=&lt;span style="font-family:Courier New;font-size:11px;font-weight:normal;"&gt;"ExecuteWhen(function() { alert('Hello !!!');}, CanIContinue );"&lt;/span&gt; /&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/pre&gt;Και ως δια μαγείας ... έπαιξε !!! Ανοίγω το "blocking", πατάω 2 - 3&amp;nbsp; κλικ στο "alert" κουμπί .. και δε γίνεται τίποτα. Μόλις κλείσω το "blocking" ... μαγικά εκτελούνται ΟΛΑ τα κλικ που είχα κάνει κλίκ πριν &lt;img src="http://www.dotnetzone.gr/cs/emoticons/emotion-1.gif" alt="Smile" /&gt;&lt;br&gt;&lt;br&gt;Τώρα αν σκέφτεστε γιατί σας πρήζω με όλα αυτά τα JavaScript-ικά ( &lt;i&gt;η ρήμα με τα Σανσκριτικά δεν είναι τυχαία ... &lt;/i&gt;), η απάντηση είναι απλή. Είναι πολύ όμορφο, και χρήσιμο. Αν το τραβήξει κανείς, με αυτή τη μεθοδούλα που επιστρέφει το boolean ( &lt;i&gt;μπορώ να συνεχίσω την εκτέλεση;&lt;/i&gt; ), μπορείς να δέσεις και να κάνεις synchronization μεθόδων, ουρές, multiple event handlers και chaining κτλ. κτλ. είναι ... execution chain &amp;amp; workflow παρεούλα, σε JavaScript παρακαλώ. Θέλει μόνο φαντασία :) &lt;br&gt;&lt;br&gt;Ελπίζω να μη βαρεθήκατε όσοι φτάσατε μέχρι το τέλος, καλό απόγευμά μας !&lt;br&gt;&lt;br&gt;O:]&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;</description></item></channel></rss>