BridgeTalkのonReceiveの正体がようやく判ったよ

夏の暑さも和らいで かなり過ごしやすくなってきた今日この頃
みなさまはいかがお過ごしでしょうか。
さてデバックが面倒で敬遠されがちなBridgeTalk。
いままで気になってはいたのですがようやくBridgeTalk.onReceive関数の使い方が判りました。

いままで、BridgeTalkといえば見送ったあとはonResult関数で帰還を待つしか手段がないと思っておりました
が…実はonReceive関数で何度も顔を覗きに戻ってこれるようなのです。
実際のソースは以下の通り。

InDesign側からBridgeTalkを一回だけ投げたあとは、
Photoshop側から何度もBridgeTalkでInDesign側に顔を出す仕掛けです。
そこで重要になるのがonReceive関数。
あっちにいったりこっちにいったりとなかなか落ち着きのない子なのですが
使い方によっては面白いことが出来るかもしれません。

#target 'indesign';
//
var data = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; 


//photoshop側の処理をまとめたもの
var PS = {
    "init" : function() { 
                   PS.RECEIVE(); /*indesignへBridgeTalkで返信*/
                   return "ID.end()"; /* InDesign側のbt.onResult関数に値が渡る */
   },

   "RECEIVE": function (){
                    var bt = new BridgeTalk(); 
                    bt.target = "indesign"; 
                    bt.onResult = function(rbt){ /* InDesign側のonReceive関数から返値が来る */
                                try{
                                    /*  結果にtrueが帰ってきたら。続けて返信 */
                                    if(eval(rbt.body)){
                                            PS.RECEIVE(); 
                                    }else{
                                    
                                    };
                                }catch(e){
                                    
                                }
                    };
                    bt.onError = function(ebt){PS.DEBUG("PS Error : "+ebt.body)};
                    bt.onTimeout = function(){PS.DEBUG("timeout...")}
                    bt.body = "ID.getDATA()"; 
                    bt.send(20);  /* InDesign側のonReceive関数に送信される */
    },

    /* 何かの処理    true か false を返す*/
    "EXE" :  function (d){
        d || d = false;
        $.sleep(300);
        PS.DEBUG(d);
        return d ? true : false;
    },
    /* */
    "DEBUG" : function(mes){
               $.writeln(mes);
    }
};



//BridgeTalk先からさらきBridgeTalkで返信が来た場合の処理;
BridgeTalk.onReceive = function( msg ) { try{  return eval(msg.body);}catch(e){return e;} }


//InDesign側の処理をまとめたもの
var ID = {
    "init" : function(){
            /*  PhotoShopへBridgeTalk */
            var bt = new BridgeTalk(); 
            bt.target = "photoshop"; 
            bt.body = "eval('var PS = "+PS.toSource()+"');PS.init();"; /* PSオブジェクトを渡して PS.initを実行 */
            bt.onResult = function( bt ) {return eval(bt.body);}; 
            bt.onError = function( bt ) {ID.DEBUG("ID Error : " + bt.body );}; 
            bt.onTimeout = function(){ID.DEBUG("timeout..")};
            bt.send(30000);
    },
    /* dataを返す */
    "getDATA" : function(){
            $.sleep(500);
            return "PS.EXE("+data.shift().toSource()+");";
            },
    /*  最後の一言 */
    "end"  : function(){ID.DEBUG("終了"); },
    
    "DEBUG" : function(mes){
               $.writeln(mes);
    }
}


ID.init();


JSONP風味な感じでやりとりするのがマイブームだったりします。
けっこう読みやすくてイケてるような気がするのですがどうでしょうか?