\r
\r
/**\r
- * <p>busy() メソッドだけを持つ。通信用のプロパティは X.Pair によって隠蔽される。\r
+ * <p>state() メソッドだけを持つ。通信用のプロパティは X.Pair によって隠蔽されています。\r
* <h4>通信のキャンセル</h4>\r
- * <p>kill() で通信待ち中はキャンセル&破棄、通信中の場合は通信の中断&破棄を行う。SUCCESS, ERROR, TIMEOUT イベント以降は kill() は無視される。\r
+ * <p>kill() で通信待ち中はキャンセル&破棄、通信中の場合は通信の中断&破棄を行う。\r
* <h4>イベント</h4>\r
* <dl>\r
* <dt>X.Event.PROGRESS<dd>通信進行状況\r
* <dt>X.Event.SUCCESS<dd>通信成功\r
- * <dt>X.Event.ERROR<dd>通信エラー\r
- * <dt>X.Event.TIMEOUT<dd>通信タイムアウト\r
- * <dt>X.Event.CANCELED<dd>通信のユーザー、プログラムによるキャンセル\r
- * <dt>X.Event.COMPLETE<dd>通信完了。SUCCESS, ERROR, TIMEOUT, CANCELED 後に発生。\r
+ * <dt>X.Event.ERROR<dd>通信エラー タイムアウトの場合、e.timeout == true で分かる。\r
+ * <dt>X.Event.CANCELED<dd>通信のユーザー、プログラムによるキャンセル。SUCCESS, ERROR, COMPLETE 後に kill()してもCANCELEDは呼ばれません。\r
+ * <dt>X.Event.COMPLETE<dd>通信完了。SUCCESS, ERROR, CANCELED 後に発生。\r
* </dl>\r
* <p>X.Net インスタンスは COMPLETE 後に自動で破棄される。\r
* <h4>必須プロパティ</h4>\r
'X.Net',\r
X_Class.NONE,\r
{\r
- 'netType' : '',\r
- 'netName' : '',\r
- 'netVersion' : 0,\r
\r
'Constructor' : function( urlOrObject, opt_options ){\r
var opt, url, type, auth;\r
X_NET_QUEUE_LIST[ X_NET_QUEUE_LIST.length ] = this;\r
!X_NET_currentQueue && X_NET_shiftQueue();\r
},\r
- \r
- /**\r
- * 現在通信中か?調べる。false の場合、通信の順番待ちか、通信が終了している。\r
- * @alias Net.prototype.busy\r
- */\r
- 'busy' : function(){\r
- return this === X_NET_currentQueue && X_NET_currentWrapper._busy;\r
- },\r
\r
/**\r
- * 現在の状態。1:待機中 2:通信中 3:通信完了フェーズ\r
+ * 現在の状態。1:順番待ち, 2:通信中, 3:通信完了フェーズ\r
* @alias Net.prototype.state\r
*/\r
'state' : function(){\r
switch( e.type ){\r
case X_EVENT_KILL_INSTANCE :\r
if( this === X_NET_currentQueue && X_NET_completePhase ){\r
- X_Pair_release( this );\r
+ if( X_NET_completePhase === 1 )\r
+ this[ 'unlisten' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch )\r
+ [ 'dispatch' ]( X_EVENT_COMPLETE );\r
X_NET_shiftQueue();\r
- X_NET_completePhase = false;\r
+ X_Pair_release( this );\r
+ X_NET_completePhase = 0;\r
} else\r
if( this === X_NET_currentQueue ){\r
X_NET_currentWrapper.cancel();\r
if( e.status === 401 ){\r
if( auth = X_Pair_get( this )[ 'auth' ] ){\r
X_Pair_get( auth ).onAuthError( auth, e );\r
+ // TODO 破棄しないで待機。\r
};\r
};\r
\r
case X_EVENT_SUCCESS :\r
- X_NET_completePhase = true;\r
- this\r
- [ 'listenOnce' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch )\r
- [ 'asyncDispatch' ]( e );\r
- this[ 'asyncDispatch' ]( 32, { type : X_EVENT_COMPLETE, 'lastEventType' : e.type } );\r
+ X_NET_completePhase = 1;\r
+ this[ 'listenOnce' ]( X_EVENT_COMPLETE, X_NET_proxyDispatch )\r
+ [ 'asyncDispatch' ]( 32, { type : X_EVENT_COMPLETE, 'lastEventType' : e.type } );\r
+\r
+ this[ 'asyncDispatch' ]( e );\r
break;\r
\r
case X_EVENT_COMPLETE :\r
- X_Pair_release( this );\r
- X_NET_shiftQueue();\r
- X_NET_completePhase = false;\r
- this[ 'unlisten' ]( X_EVENT_KILL_INSTANCE, X_NET_proxyDispatch );\r
+ X_NET_completePhase = 2;\r
this[ 'kill' ]();\r
break;\r
};\r
\r
if( X_NET_currentQueue ){\r
if( X_NET_currentWrapper._busy ) return;\r
+ \r
X_NET_currentWrapper\r
[ 'unlisten' ]( [ X_EVENT_PROGRESS, X_EVENT_SUCCESS, X_EVENT_ERROR ], X_NET_currentQueue, X_NET_proxyDispatch )\r
.reset();\r
+\r
X_NET_currentQueue = X_NET_currentWrapper = X_NET_currentData = null;\r
};\r
\r
case 1 :\r
case 2 :\r
if( !( auth[ 'dispatch' ]( X_EVENT_NEED_AUTH ) & X_Callback_PREVENT_DEFAULT ) ){\r
- authSettings.lazyReq = X_NET_currentQueue;\r
+ authSettings.lazyRequests = authSettings.lazyRequests || [];\r
+ authSettings.lazyRequests.indexOf( X_NET_currentQueue ) === -1 && authSettings.lazyRequests.push( X_NET_currentQueue );\r
};\r
X_NET_currentQueue = null;\r
X_NET_shiftQueue();\r