X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=0.6.x%2Fjs%2F06_net%2F00_XNet.js;h=90693963a7b992dd65e4e0d73dccea361c80d8ee;hb=4e4ab3be10850546063d4a4b93250ed142bb8cd2;hp=fc5dc58674270d8c38ddcfaab65fbdef0efd54d5;hpb=2612dc17dae6ba790807049d2587e8a2910007cc;p=pettanr%2FclientJs.git diff --git a/0.6.x/js/06_net/00_XNet.js b/0.6.x/js/06_net/00_XNet.js index fc5dc58..9069396 100644 --- a/0.6.x/js/06_net/00_XNet.js +++ b/0.6.x/js/06_net/00_XNet.js @@ -7,25 +7,25 @@ /** - *

busy() メソッドだけを持つ。通信用のプロパティは X.Pair によって隠蔽される。 + *

state() メソッドだけを持つ。通信用のプロパティは X.Pair によって隠蔽されています。 *

通信のキャンセル

- *

kill() で通信待ち中はキャンセル&破棄、通信中の場合は通信の中断&破棄を行う。SUCCESS, ERROR, TIMEOUT イベント以降は kill() は無視される。 + *

kill() で通信待ち中はキャンセル&破棄、通信中の場合は通信の中断&破棄を行う。 *

イベント

*
*
X.Event.PROGRESS
通信進行状況 *
X.Event.SUCCESS
通信成功 - *
X.Event.ERROR
通信エラー - *
X.Event.TIMEOUT
通信タイムアウト - *
X.Event.CANCELED
通信のユーザー、プログラムによるキャンセル - *
X.Event.COMPLETE
通信完了。SUCCESS, ERROR, TIMEOUT, CANCELED 後に発生。 + *
X.Event.ERROR
通信エラー タイムアウトの場合、e.timeout == true で分かる。 + *
X.Event.CANCELED
通信のユーザー、プログラムによるキャンセル。SUCCESS, ERROR, COMPLETE 後に kill()してもCANCELEDは呼ばれません。 + *
X.Event.COMPLETE
通信完了。SUCCESS, ERROR, CANCELED 後に発生。 *
*

X.Net インスタンスは COMPLETE 後に自動で破棄される。 *

必須プロパティ

*
*
url
URL - *
type
'xhr', 'jsonp', 'image', 'img' + *
type
'xhr', 'jsonp', 'form', 'image', 'img' *
xhr
URL { url : 'hoge', type : 'xhr' } の省略形 *
jsonp
URL { url : 'hoge', type : 'jsonp' } の省略形 + *
form
URL { url : 'hoge', type : 'form' } の省略形 *
image, img
URL { url : 'hoge', type : 'image' } の省略形 *
*

XHR 用プロパティ

@@ -51,7 +51,16 @@ *
params
url パラメータを object で渡すことが出来る。 *
callbackName
callback(json) コールバック名が固定されている際に指定。または &callback=hoge 以外の名前でコールバックを指定する場合に params と callbackName に書いておく。url パラメータに callback が無く、callbackName もない場合、フレームワーク内で自動で設定される *
charset
ページと異なるjsonpを読み込む場合に指定 'EUC-JP', 'Shift-JIS' 等 script タグの charset に入る。https://code.google.com/p/ajaxzip3/issues/detail?id=5 - *
useFireWall
異なるドメインに jsonp を読み込んだ後、xdomain iframe 通信を使ってデータを受け取る。不正なコードの実行を防ぐことが出来る、未実装 + *
useFireWall
異なるドメインに jsonp を読み込んだ後、xdomain iframe 通信を使ってデータを受け取る。不正なコードの実行を防ぐことが出来る(はず)、未実装 + * + * + *

Form 用プロパティ

+ *
+ *
method
'GET' or 'POST' + *
params
パラメータ object は input タグの name & value に展開される。object を入れ子にすることはできない。 + *
target
'_self', '_parent', '_top' の場合、ページから離脱する。target を指定せず同一ドメインの場合 response に body.innerHTML が返る。TODO X.Window + *
timeout
ms タイムアウト時間、省略可能 + *
charset
未実装 *
* * @alias X.Net @@ -73,7 +82,7 @@ * var net = X.Net( { jsonp : urlString, params : params, callbackName : callbackName, charset : charset, useFireWall : false } ); * * // Form - * var net = X.Net( { form : urlString, method : 'POST', target : '_self', params : {} } ); // _self, _parent, _top の場合、ページから離脱する + * var net = X.Net( { form : urlString, method : 'POST', target : '_self', params : {} } ); * * // Image preload & getSize * var net = X.Net( { image : src, sizeDetection : true } ); @@ -84,9 +93,6 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ]( 'X.Net', X_Class.NONE, { - 'netType' : '', - 'netName' : '', - 'netVersion' : 0, 'Constructor' : function( urlOrObject, opt_options ){ var opt, url, type, auth; @@ -152,8 +158,8 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ]( opt[ 'auth' ] = auth; // auth は deep copy されるとまずい }; - // params を url に追加 - if( opt[ 'params' ] ){ + // params を url に追加 但し form は除く + if( opt[ 'params' ] && type !== X_NET_TYPE_FORM ){ url = X_URL_create( url, opt[ 'params' ] ); delete opt[ 'params' ]; }; @@ -163,14 +169,14 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ]( // XDomain 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替? // PUT DELETE UPDATE 不可 -> Flash, Gears, Silverlight, canUseGadget なら gadget に切替? - // xプロトコル な binary のロード -> gadget 内で proxyURL による XHR + // xプロトコル(X_URL_isSameProtocol) な binary のロード -> gadget 内で proxyURL による XHR // or X_EVENT_ERROR opt[ 'dataType' ] = opt[ 'dataType' ] || X_URL_getEXT( url ); }; opt.netType = type; - opt[ 'url' ] = url; + opt[ 'url' ] = url; X_Pair_create( this, opt ); @@ -179,13 +185,15 @@ X[ 'Net' ] = X_EventDispatcher[ 'inherits' ]( X_NET_QUEUE_LIST[ X_NET_QUEUE_LIST.length ] = this; !X_NET_currentQueue && X_NET_shiftQueue(); }, - + /** - * 現在通信中か?調べる。false の場合、通信の順番待ちか、通信が終了している。 - * @alias Net.prototype.busy + * 現在の状態。1:順番待ち, 2:通信中, 3:通信完了フェーズ + * @alias Net.prototype.state */ - 'busy' : function(){ - return this === X_NET_currentQueue && X_NET_currentWrapper._busy; + 'state' : function(){ + return this === X_NET_currentQueue ? + ( X_NET_completePhase ? 3 : 2 ) : + 0 <= X_NET_QUEUE_LIST.indexOf( this ) ? 1 : 0; } } ); @@ -213,11 +221,11 @@ var X_NET_TYPE_XHR = 1, X_NET_QUEUE_LIST = [], - X_NET_XHRWrapper, - X_NET_JSONPWrapper, - X_NET_FormWrapper, - X_NET_ImageWrapper, - X_NET_GIMRWrapper, + X_XHR, + X_JSONP, + X_FormSender, + X_ImgLoader, + X_GadgetXHR, X_NET_currentWrapper, X_NET_currentQueue, @@ -230,13 +238,17 @@ function X_NET_proxyDispatch( e ){ switch( e.type ){ case X_EVENT_KILL_INSTANCE : if( this === X_NET_currentQueue && X_NET_completePhase ){ + if( X_NET_completePhase === 1 ){ + this[ 'unlisten' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch ) + [ 'dispatch' ]( X_EVENT_COMPLETE ); + }; + X_NET_shiftQueue( true ); X_Pair_release( this ); - X_NET_shiftQueue(); - X_NET_completePhase = false; + X_NET_completePhase = 0; } else if( this === X_NET_currentQueue ){ X_NET_currentWrapper.cancel(); - X_NET_shiftQueue(); + X_NET_shiftQueue( true ); flag = true; } else if( ( i = X_NET_QUEUE_LIST.indexOf( this ) ) !== -1 ){ @@ -258,41 +270,45 @@ function X_NET_proxyDispatch( e ){ if( e.status === 401 ){ if( auth = X_Pair_get( this )[ 'auth' ] ){ X_Pair_get( auth ).onAuthError( auth, e ); + // TODO 破棄しないで待機。 }; }; case X_EVENT_SUCCESS : - X_NET_completePhase = true; - this - [ 'listenOnce' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch ) - [ 'asyncDispatch' ]( e ); - this[ 'asyncDispatch' ]( 32, { type : X_EVENT_COMPLETE, 'lastEventType' : e.type } ); + X_NET_completePhase = 1; + this[ 'listenOnce' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch ) + [ 'asyncDispatch' ]( 32, { type : X_EVENT_COMPLETE, 'lastEventType' : e.type } ); + + this[ 'asyncDispatch' ]( e ); break; case X_EVENT_COMPLETE : - X_Pair_release( this ); - X_NET_shiftQueue(); - X_NET_completePhase = false; - this[ 'unlisten' ]( X_EVENT_KILL_INSTANCE, X_NET_proxyDispatch ); + X_NET_completePhase = 2; this[ 'kill' ](); break; }; }; -function X_NET_shiftQueue(){ - var auth, authSettings; +// TODO _busy は X.Net で触る. +function X_NET_shiftQueue( currentKilled ){ + var q, auth, authSettings; if( X_NET_currentQueue ){ - if( X_NET_currentWrapper._busy ) return; + if( !currentKilled ) return; + X_NET_currentWrapper [ 'unlisten' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR ], X_NET_currentQueue, X_NET_proxyDispatch ) .reset(); + X_NET_currentQueue = X_NET_currentWrapper = X_NET_currentData = null; }; + console.log( '■■------------ X_NET_shiftQueue ' + X_NET_QUEUE_LIST.length ); + if( !X_NET_QUEUE_LIST.length ) return; - X_NET_currentQueue = X_NET_QUEUE_LIST.shift(); + + X_NET_currentQueue = q = X_NET_QUEUE_LIST.shift(); X_NET_currentData = X_Pair_get( X_NET_currentQueue ); switch( X_NET_currentData.netType ){ @@ -302,13 +318,13 @@ function X_NET_shiftQueue(){ // force 'gadget', 'flash' switch( X_NET_currentData[ 'test' ] ){ case 'gadget' : - X_NET_currentWrapper = X_NET_GIMRWrapper || X_TEMP.X_Net_GIMR_init(); + X_NET_currentWrapper = X_GadgetXHR || X_TEMP.X_GadgetXHR_init(); break; case 'flash' : break; default : - X_NET_currentWrapper = X_NET_XHRWrapper || X_TEMP.X_Net_XHR_init(); + X_NET_currentWrapper = X_XHR || X_TEMP.X_XHR_init(); }; @@ -319,12 +335,18 @@ function X_NET_shiftQueue(){ case 0 : case 1 : case 2 : - if( !( auth[ 'dispatch' ]( X_EVENT_NEED_AUTH ) & X_Callback_PREVENT_DEFAULT ) ){ - authSettings.lazyReq = X_NET_currentQueue; + if( !( auth[ 'dispatch' ]( X_EVENT_NEED_AUTH ) & X_CALLBACK_PREVENT_DEFAULT ) ){ + // event 内で kill されていないことを確認 + if( X_NET_currentQueue === q ){ + authSettings.lazyRequests = authSettings.lazyRequests || []; + authSettings.lazyRequests.indexOf( q ) === -1 && authSettings.lazyRequests.push( q ); + X_NET_currentQueue = null; + X_NET_shiftQueue(); + }; + } else { + X_NET_currentQueue === q && q[ 'kill' ](); }; - X_NET_currentQueue = null; - X_NET_shiftQueue(); - break; + return; case 3 : // refresh token X_NET_QUEUE_LIST.push( X_NET_currentQueue ); X_NET_currentQueue = null; @@ -335,13 +357,13 @@ function X_NET_shiftQueue(){ }; break; case X_NET_TYPE_JSONP : - X_NET_currentWrapper = X_NET_JSONPWrapper || X_TEMP.X_NET_JSONP_init(); + X_NET_currentWrapper = X_JSONP || X_TEMP.X_JSONP_init(); break; case X_NET_TYPE_FORM : - X_NET_currentWrapper = X_NET_FormWrapper || X_TEMP.X_NET_Form_init(); + X_NET_currentWrapper = X_FormSender || X_TEMP.X_FormSender_init(); break; case X_NET_TYPE_IMAGE : - X_NET_currentWrapper = X_NET_ImageWrapper || X_TEMP.X_NET_Image_init(); + X_NET_currentWrapper = X_ImgLoader || X_TEMP.X_ImgLoader_init(); break; };