BridgeTalkまとめ…というか覚え書き【修正】
イラストレーターのtoSource,unevalがObjectでスタックオーバーランしていたのは自分の書いたスクリプト[c.js]が悪さしていたようです。オブジェクトを安易に汚染するのは良くないですね。
とういうことで上記に関わる部分を削除しました。
BridgeTalkについてできるだけまとめてみる。
というか、現在自分が理解できている範囲の覚え書きです。
BridgeTalkするアプリケーションのバージョンを指定
bt.target = "illustrator";
と書いていて、同じCSのバージョン同士でしか使えないと思ってたんだけど、CS3以降であればCSバージョンをまたいで指定することができる。
bt.target = "illustrator-13.0";//Bridge CS3 bt.target = "illustrator-14.0";//Bridge CS4
投げた処理が終わったら実行する。
投げた処理が終わり次第、実行させるものを書いておく。
ここで処理が終わるまでは待っていてはくれない。
非同期になるのでそれを踏まえた書き方をしなくてはいけない。
詳しくは中綴千頁さんが解説されている。Double-talk Publisher BridgeTalk考
bt.onResult = function(resObj) {};
**BridgeTalkは同期も非同期もいける
BridgeTalkは非同期なのかと勘違いしていたんだけど、
onResultに無名関数でもいいのでonResultに関数を設定すれば、
処理が終わるまで待ってくれるみたい。
onResultで帰ってきたオブジェクトはBridgeTalkObjectでbodyに返り値が入ってる。
bt.onResult = function(resObj) {processResult(resObj.body);};
実際に送るbodyに入れるScriptは、uneval()やtoSource()を使うとよい。
普通にfunctionを書くように書けるので楽。
bt.body=uneval(function(){})+"()"; bt.body=function(){}.toSource()+"()";
引数で渡す場合や戻り値は、uneval()やtoSource()を使うとよい。
引数で渡す場合
bt.body=uneval(function(val){ val = eval(val); })+"("+['A','B','C'].toSource()+");";
戻り値にする場合
return val.toSource();
ただし、イラストレターのuneval()とtoSource()はObjectに摘要するとスタックエラーが出てしまう。
回避策としては、こんな感じでfunctionで包んでしまうといける。
uneval(function(){return {sleep:5000};});
この場合は
eval('val =' +val+"();");
としてもとに戻す。
send()にはタイムアウトまでの秒数を引数として指定できる。
bt.send(30);
onTimeoutにタイムアウト時の処理を書けばいいらしい。
bt.onTimeout = function(){...}
まとめて書いたらこんな感じ。
(function(){ //TEST用 var bt = new BridgeTalk; bt.target = "bridge"; //ターゲットへ送るScriptを記入 //コメントアウトを含めていたりするとエラーが出たりする。 bt.body = function(Value){ $.sleep (5000); return Value.toSource(); }.toSource()+"("+uneval({message:"bridgeでの処理が終わりました。"})+");"; //返り値に対しての処理を記入 bt.onResult = function(resObj) { Value = eval(resObj.body); alert(Value.message); flag = false; }; //TimeOutした場合の処理を記入 bt.onTimeout = function(resObj){ alert('タイムアウトになりました。'); } //使い方がよく判らない。 /* bt.onReceive = function(resObj){ $.bp(); }; */ //送ったスクリプトでエラーが出た場合の処理を記入 bt.onError = function(resObj){alert( resObj.body + " (" + resObj.headers ["Error-Code"] + ")" );}; //スクリプトの送信を実行。引数にはタイムアウトまでの秒数を指定。 bt.send(1); //TEST alert('非同期なので先にこのメッセージが表示される'); })();
課題
- onRecive()の使い方がよく判らない。AIRと併用するものなのか?
- Timeoutしても送った先のアプリケーションで処理は続いている。どうやってとめるの?