a m p l e _ s y n c ( p a r a m ) { v a r n u m = g e t N u m b e r S y n c ( p a r a m ) ; v a r t e x t = g e n e r a t e T e x t S y n c ( n u m ) ; c h e c k N g W o r d S y n c ( t e x t ) ; r e t u r n { n u m : n u m , t e x t : t e s t } ; } ※ 注 : checkNgWordSync は 、NG ならエラーを投 げ る こ のコード が、 非同期呼び出しになるとど う なる か 見て いく 16 / 104
s a m p l e _ p l a i n ( p a r a m , c a l l b a c k ) { g e t N u m b e r ( f u n c t i o n ( e r r , n u m ) { i f ( e r r ) { r e t u r n c a l l b a c k ( e r r ) ; } g e n e r a t e T e x t ( n u m , f u n c t i o n ( e r r , t e x t ) { i f ( e r r ) { r e t u r n c a l l b a c k ( e r r ) ; } c h e c k N g W o r d ( t e x t , f u n c t i o n ( e r r ) { i f ( e r r ) { r e t u r n c a l l b a c k ( e r r ) ; } c a l l b a c k ( n u l l , { n u m : n u m , t e x t : t e x t } ) ; } ) ; } ) ; } ) ; } ; 17 / 104
m p l e _ s e r i e s ( p a r a m , c a l l b a c k ) { v a r n u m , t e x t ; a s y n c . s e r i e s ( [ f u n c t i o n ( n e x t ) { g e t N u m b e r ( p a r a m , f u n c t i o n ( e r r , _ n u m ) { i f ( e r r ) { r e t u r n n e x t ( e r r ) ; } n u m = _ n u m ; n e x t ( ) ; } ) ; } , f u n c t i o n ( n e x t ) { g e n e r a t e T e x t ( n u m , f u n c t i o n ( e r r , _ t e x t ) { i f ( e r r ) { r e t u r n n e x t ( e r r ) ; } t e x t = _ t e x t ; n e x t ( ) ; } ) ; } , f u n c t i o n ( n e x t ) { c h e c k N g W o r d ( t e x t , n e x t ) ; } ] , f u n c t i o n ( e r r ) { i f ( e r r ) { r e t u r n c a l l b a c k ( e r r ) ; } c a l l b a c k ( n u l l , { n u m : n u m , t e x t : t e x t } ) ; } ) ; } 22 / 104
m p l e _ p l a i n ( p a r a m , c a l l b a c k ) { g e t N u m b e r ( f u n c t i o n ( e r r , n u m ) { i f ( e r r ) { r e t u r n c a l l b a c k ( e r r ) ; } g e n e r a t e T e x t ( n u m , f u n c t i o n ( e r r , t e x t ) { i f ( e r r ) { r e t u r n c a l l b a c k ( e r r ) ; } c h e c k N g W o r d ( t e x t , f u n c t i o n ( e r r ) { i f ( e r r ) { r e t u r n c a l l b a c k ( e r r ) ; } c a l l b a c k ( n u l l , { n u m : n u m , t e x t : t e x t } ) ; } ) ; } ) ; } ) ; } ; ※ 非同期コード例 (plain) 比較用に再掲 23 / 104
s a m p l e _ w a t e r f a l l ( p a r a m , c a l l b a c k ) { v a r n u m , t e x t ; a s y n c . w a t e r f a l l ( [ f u n c t i o n ( n e x t ) { g e t N u m b e r ( p a r a m , n e x t ) ; } , f u n c t i o n ( _ n u m , n e x t ) { n u m = _ n u m ; g e n e r a t e T e x t ( n u m , n e x t ) ; } , f u n c t i o n ( _ t e x t , n e x t ) { t e x t = _ t e x t ; c h e c k N g W o r d ( t e x t , n e x t ) ; } , f u n c t i o n ( n e x t ) { n e x t ( n u l l , { n u m : n u m , t e x t : t e x t } ) ; } ] , c a l l b a c k ) ; } 25 / 104
s a m p l e _ w a t e r f a l l 1 ( p a r a m , c a l l b a c k ) { v a r n u m , t e x t ; a s y n c . w a t e r f a l l ( [ f u n c t i o n ( n e x t ) { n e x t ( n u l l , 1 ) ; } , f u n c t i o n ( _ n u m , n e x t ) { n u m = _ n u m ; n e x t ( n u l l , ' t e x t ' ) ; } , f u n c t i o n ( _ t e x t , n e x t ) { t e x t = _ t e x t ; n e x t ( ) ; } , f u n c t i o n ( n e x t ) { n e x t ( n u l l , { n u m : n u m , t e x t : t e x t } ) ; } ] , c a l l b a c k ) ; } 26 / 104
c h e c k N g W o r d ( t e x t , c a l l b a c k ) { c a l l b a c k ( ) ; } f u n c t i o n s a m p l e _ w a t e r f a l l ( p a r a m , c a l l b a c k ) { v a r n u m , t e x t ; a s y n c . w a t e r f a l l ( [ f u n c t i o n ( n e x t ) { g e t N u m b e r ( p a r a m , n e x t ) ; } , f u n c t i o n ( _ n u m , n e x t ) { n u m = _ n u m ; g e n e r a t e T e x t ( n u m , n e x t ) ; } , f u n c t i o n ( _ t e x t , n e x t ) { t e x t = _ t e x t ; c h e c k N g W o r d ( t e x t , n e x t ) ; } , f u n c t i o n ( n e x t ) { n e x t ( n u l l , { n u m : n u m , t e x t : t e x t } ) ; } ] , c a l l b a c k ) ; } 28 / 104
t i o n c h e c k N g W o r d ( t e x t , c a l l b a c k ) { c a l l b a c k ( n u l l , { / * d e t a i l * / } ) ; } f u n c t i o n s a m p l e _ w a t e r f a l l ( p a r a m , c a l l b a c k ) { v a r n u m , t e x t ; a s y n c . w a t e r f a l l ( [ f u n c t i o n ( n e x t ) { g e t N u m b e r ( p a r a m , n e x t ) ; } , f u n c t i o n ( _ n u m , n e x t ) { n u m = _ n u m ; g e n e r a t e T e x t ( n u m , n e x t ) ; } , f u n c t i o n ( _ t e x t , n e x t ) { t e x t = _ t e x t ; c h e c k N g W o r d ( t e x t , n e x t ) ; } , f u n c t i o n ( n e x t ) { n e x t ( n u l l , { n u m : n u m , t e x t : t e x t } ) ; } ] , c a l l b a c k ) ; } c h e c k N g W o r d の修正により 、 s a m p l e _ w a t e r f a l l が 動 か な く なって い る 29 / 104
o n c h e c k N g W o r d ( t e x t , c a l l b a c k ) { c a l l b a c k ( n u l l , { / * d e t a i l * / } ) ; } f u n c t i o n s a m p l e _ w a t e r f a l l ( p a r a m , c a l l b a c k ) { v a r n u m , t e x t ; a s y n c . w a t e r f a l l ( [ f u n c t i o n ( n e x t ) { g e t N u m b e r ( p a r a m , n e x t ) ; } , f u n c t i o n ( _ n u m , n e x t ) { n u m = _ n u m ; g e n e r a t e T e x t ( n u m , n e x t ) ; } , f u n c t i o n ( _ t e x t , n e x t ) { t e x t = _ t e x t ; c h e c k N g W o r d ( t e x t , n e x t ) ; } , f u n c t i o n ( u n u s e d , n e x t ) { n e x t ( n u l l , { n u m : n u m , t e x t : t e x t } ) ; } ] , c a l l b a c k ) ; } 30 / 104
e q u i r e ( ' n e o - a s y n c ' ) ; f u n c t i o n c h e c k N g W o r d ( t e x t , c a l l b a c k ) { c a l l b a c k ( n u l l , { / * d e t a i l * / } ) ; } f u n c t i o n s a m p l e _ a n g e l F a l l ( p a r a m , c a l l b a c k ) { v a r n u m , t e x t ; a s y n c . a n g e l F a l l ( [ f u n c t i o n ( n e x t ) { g e t N u m b e r ( p a r a m , n e x t ) ; } , f u n c t i o n ( _ n u m , n e x t ) { n u m = _ n u m ; g e n e r a t e T e x t ( n u m , n e x t ) ; } , f u n c t i o n ( _ t e x t , n e x t ) { t e x t = _ t e x t ; c h e c k N g W o r d ( t e x t , n e x t ) ; } , f u n c t i o n ( n e x t ) { n e x t ( n u l l , { n u m : n u m , t e x t : t e x t } ) ; } ] , c a l l b a c k ) ; } 33 / 104
a m p l e _ s y n c ( p a r a m ) { v a r x = g e t X ( p a r a m ) ; i f ( x ) { v a r y = g e t Y ( ) ; v a r z = g e t Z ( ) ; d o S o m e t h i n g ( y , z ) ; } r e t u r n g e t W ( x ) ; } 36 / 104
t i o n s a m p l e _ a s y n c ( p a r a m , c a l l b a c k ) { v a r x ; a s y n c . a n g e l F a l l ( [ f u n c t i o n ( n e x t ) { g e t X ( p a r a m , n e x t ) ; } , f u n c t i o n ( _ x , n e x t ) { x = _ x ; i f ( ! x ) { r e t u r n n e x t ( ) ; } a s y n c . p a r a l l e l ( { y : g e t Y , z : g e t Z } , n e x t ) ; } , f u n c t i o n ( r e s u l t , n e x t ) { i f ( ! x ) { r e t u r n n e x t ( ) ; } d o S o m e t h i n g ( r e s u l t . y , r e s u l t . z , n e x t ) ; } , f u n c t i o n ( n e x t ) { g e t W ( x , n e x t ) : } ] , c a l l b a c k ) ; } 37 / 104
b l o c k = r e q u i r e ( ' a s y n c b l o c k ' ) ; f u n c t i o n s a m p l e _ a s y n c b l o c k ( p a r a m , c a l l b a c k ) { a s y n c b l o c k ( f u n c t i o n ( f l o w ) { f l o w . e r r o r C a l l b a c k = c a l l b a c k ; v a r x = g e t X ( p a r a m ) . d e f e r ( ) ; i f ( x ) { v a r y = g e t Y ( ) . d e f e r ( ) ; v a r z = g e t Z ( ) . d e f e r ( ) ; d o S o m e t h i n g ( y , z ) . s y n c ( ) ; } c a l l b a c k ( n u l l , g e t W ( x ) . s y n c ( ) ) ; } ) ; } 40 / 104
99%く ら い(?) は ID で引 く ex) Quest マスタ { ' q u e s t 0 1 ' : { q u e s t _ i d : ' q u e s t 0 1 ' , m a p _ i d : ' m a p 0 1 ' , t a s k s : [ . . . ] } , ' q u e s t 0 2 ' : { q u e s t _ i d : ' q u e s t 0 2 ' , m a p _ i d : ' m a p 0 2 ' , t a s k s : [ . . . ] } } 48 / 104
可能性 があ る ただの JavaScript 上のオブジェクトなので 。。 やら か して障害にした経験 あ り 対策 : 起動時に Object.freeze を再帰的に行 う ' u s e s t r i c t ' 変更しよ う とした瞬間に TypeError ??? 15m 51 / 104
a r ( ) { / * . . . * / } ; C a r . p r o t o t y p e . d r i v e = f u n c t i o n ( ) { / * . . . * / } ; C a r . p r o t o t y p e . p l a y = f u n c t i o n ( ) { t h i s . d r i v e ( ) ; } ; f u n c t i o n S a g a w a ( ) { / * . . . * / } u t i l . i n h e r i t s ( S a g a w a , C a r ) ; S a g a w a . p r o t o t y p e . p l a y = f u n c t i o n ( ) { t h i s . t e l ( ) ; t h i s . d r i v e ( ) ; } ; Sagawa#telが 非同期呼び出しになると 、Car#playが 非同期になる 64 / 104
3 : 5 1 i n f o i n i t i a l i z e m o d u l e s 1 9 : 5 3 : 5 2 i n f o c o n f i g u r e m a s t e r 1 9 : 5 3 : 5 2 i n f o l o a d i n g m a s t e r 1 9 : 5 3 : 5 5 i n f o [ m a s t e r c h a n g e r ] c h a n g e m a s t e r d a t a : e n e m y 1 9 : 5 3 : 5 5 i n f o [ m a s t e r c h a n g e r ] c h a n g e m a s t e r d a t a : g a c h a 1 9 : 5 3 : 5 6 i n f o [ m a s t e r c h a n g e r ] a d d e d m a s t e r : c o m b i n a t i o n _ s k i l l _ h a s h 1 9 : 5 3 : 5 6 i n f o [ m a s t e r c h a n g e r ] a d d e d m a s t e r : i t e m _ b y _ t y p e 1 9 : 5 3 : 5 6 w a r n [ m a s t e r c h a n g e r ] d e l e t e d 3 4 k e y s f r o m n o t i c e 1 9 : 5 3 : 5 7 w a r n [ m a s t e r c h a n g e r ] a d d e d 2 8 2 0 k e y s t o e n e m y _ s k i l l 1 9 : 5 3 : 5 7 i n f o l o a d i n g m a s t e r / c h a n g i n g m a s t e r : d o n e . t i m e : 4 8 8 2 m s 1 9 : 5 3 : 5 7 i n f o f r e e z i n g m a s t e r 1 9 : 5 4 : 1 1 i n f o f r e e z i n g m a s t e r : d o n e . t i m e : 1 4 2 5 3 m s 1 9 : 5 4 : 1 2 i n f o S t a r t t o i n i t i a l i z e N e w R e l i c . 1 9 : 5 4 : 1 3 i n f o s e r v e r s t a r t e d キャッシュへの読み込みに 3 秒 キャッシュの変形に 2 秒 Object.freeze に 14 秒 86 / 104
s s . o n ( ' u n c a u g h t E x c e p t i o n ' , f u n c t i o n ( e r r ) { c o n s o l e . l o g ( e r r ) ; / / 障害端末を鳴らすコー ド / / 終了はしない } ) ; 89 / 104
a r d o m a i n = r e q u i r e ( ' d o m a i n ' ) ; / / m i d d l e w a r e f u n c t i o n ( r e q , r e s , n e x t ) { v a r d = d o m a i n . c r e a t e ( ) ; d . o n ( ' e r r o r ' , f u n c t i o n ( e r r ) { / / 障害端末を鳴らすコー ド n e x t ( e r r ) ; } ) ; d . r u n ( n e x t ) ; } 90 / 104