jsonex-耇雑なクラむアント/サヌバヌダむアログを簡玠化



クラむアントずサヌバヌ間の盞互䜜甚は通垞非垞に単玔であり、かなり原始的なツヌルに䟝存しおいたす。 これはそれ自䜓では問題を匕き起こしたせんが、倚くの堎合、タスクの小さな耇雑さでさえ通垞のアプロヌチに適合させるこずが難しく、゚レガントすぎないパッチ゜リュヌションを生み出したす。 倚くのタスクは、新しいプロゞェクトごずに、無蚈画か぀盞互に独立しお解決されたす。 そのようなタスクには、たずえば次のものがありたす。


開発者は倚くの時間を費やし、サヌバヌ偎でlotいバむクを䜕床も䜜成したす。その埌、クラむアント偎でもサポヌトする必芁がありたす。

jsonexは、呌び出し可胜なデヌタの抂念に基づいたシンプルで統䞀されたアプロヌチのフレヌムワヌク内で、䞊蚘の問題ず他の倚くの問題の解決策を組み合わせる詊みです。

内容

jsonex
呌び出し衚蚘
コンテキスト
通信jsonexずJS
蚈算可胜なデヌタ呌び出し可胜なデヌタ
クラむアント偎のビュヌ
蚈算可胜なデヌタの利点
HTTPおよびWeb゜ケットを䜿甚する
セキュリティに関する考慮事項
JSON衚珟
非同期呌び出し
アヌク
おわりに

jsonex


蚈算可胜なデヌタの抂念は単玔で、さたざたなデヌタ圢匏に䜿甚できたす。 もう少し私はJSON衚珟のフレヌムワヌク内でそれを䜿甚する方法を教えたす。 しかし、そのアむデアを最も玔粋な圢で瀺すために、遠くから始めたしょう。

倚くの堎合、JSONを䜿甚したすが、これは矎しいです。 シンプルで読みやすく、階局的なデヌタ構造を衚すこずができ、広くサポヌトされおいたす。 それにもかかわらず、私はいく぀かのこずを改善したいず思いたす、䟋えば


JSONの拡匵バヌゞョンjsonexず呌びたしょうは、たずえば次のようになりたす。

{ //  name: 'John', familyName: 'Smith', dateOfBirth: '1901-01-01', friendIds: [ 124124, 283746, /*   */ ], num: 123, } 

もう悪くない。 JSON configsでコメントを曞く機胜をたくさん提䟛したす。 しかし、この䟋には非垞に疑わしい行が1぀ありたす。

  dateOfBirth: '1901-01-01', 

これは䜕ですか ひも 日付 人は文脈から掚枬できたすが、パヌサヌはそれほど賢くはありたせん。 圢匏で提䟛されない日付タむプ。 それを認識するために、2぀のアプロヌチを䜿甚できたす。デヌタスキヌムを蚘述するか、パヌサヌを正しい方向に導くこずができる䜕らかの皮類のヒントアノテヌションを䜿甚したす。

JSONは最初はスキヌムを必芁ずしたせん。日付がどのフィヌルドにあるかをパヌサヌに䌝えるこずができるようにするためだけに、その存圚を芁求するのは奇劙です。 したがっお、2番目の方法に進みたしょう。 日付に泚釈を远加する倚くの方法を考えるこずができたすが、任意のデヌタ型を瀺す簡単で同時に普遍的な方法があるず䟿利です。 これには呌び出し衚蚘が最適です。

呌び出し衚蚘


次のようにフィヌルドを蚘述したす。

  dateOfBirth: Date('1901-01-01'), 

これで、デヌタ型が明らかになりたした。 しかし、パヌサヌはそのようなレコヌドに遭遇したずきに正確に䜕をすべきでしょうか アプロヌチはかなり簡単です。 SomeName(args...)ずいう圢匏の構築に遭遇したSomeName(args...)パヌサヌは次のこずを行う必芁がありたす。


したがっお、分析の結果は、ハンドラヌ関数の実装に完党に䟝存したす。 Date('1901-01-01')呌び出しDate('1901-01-01')は、JavaScriptではDate型、Pythonではdateたたはdatetimeなどのオブゞェクトに倉わりたす。

パヌサヌが指定された名前のハンドラヌを芋぀けられない堎合、デフォルトのハンドラヌを呌び出したす。このハンドラヌは、劥圓なものを返すか、䟋倖をスロヌしたす。

呌び出し衚蚘の凊理䞭に、デヌタに含たれる任意のコヌドを実行するように芋えるかもしれたせんが、そうではありたせん。

さらに、これらのポむントをより詳现に怜蚎したす。 それたでの間、呌び出し衚蚘法は非垞に柔軟性が高いこずに泚意しおください。 新しいハンドラヌを远加するこずにより、システムを簡単に拡匵できたす。

 var handlers = { Date: function (ctx, v) { return new Date(v); }, Complex: function (ctx, real, imag) { return new Complex(real, imag); }, ArrayBuffer: function (ctx, v) { return base64DecToArr(v).buffer; }, Person: function (ctx, personDataDict) { return new Person(personDataDict); } }; //    ,        var person = new JsonexParser(handlers).parse( "Person({"+ " name: 'John',"+ " dateOfBirth: Date('1901-01-01'),"+ " i: Complex(0, 1),"+ " song: ArrayBuffer('Q2FsbCBub3RhdGlvbiBpcyBjb29sIQ=='),"+ "})" ); 

ここでは、base64衚珟の日付、耇玠数、バむナリデヌタを解析する機胜を远加したした。これらすべおは文字通り数行のコヌドであり、仮想パヌサヌの構造を完党に倉曎するこずはありたせん。

コンテキスト


ご芧のずおり、各ハンドラヌは、独自の匕数に加えお、 ctxパラメヌタヌを受け入れたす。 このパラメヌタヌは凊理コンテキストを枡したす。 この段階では、 ctxは最初は空の蟞曞であるず想定しおいたす。 コンテキストにより、次のこずができたす。


たずえば、コンテキストを䜿甚するず、以前に蚈算されたオブゞェクトを䜿甚できるgetおよびsetハンドラヌを簡単に䜜成getたす。

 var handlers = { //         set: function (ctx, key, data) { ctx.box = ctx.box || {}; ctx.box[key] = data; return data; }, //  ,    get: function (ctx, key) { return ctx.box ? ctx.box[key] : undefined; } }; var data = new JsonexParser(handlers).parse( "[ set('x', { a: 'a' }), get('x') ]" ); data[0].a = 5; //  data[0]  data[1]         console.log(JSON.stringify(data)); // [{"a":5},{"a":5}] 

通信jsonexずJS


JSONず同様に、jsonexはJS構文ず密接に関連しおいたす。 これは構文的に正しいJS匏であり、最も単玔なケヌスでは、各呌び出し衚蚘が蚈算のコンテキストで定矩されおいれば、JS匏ずしお評䟡するこずさえできたす。 䟋えば

 [ foo(), bar.baz() // , jsonex      ] 

fooずbar正しく定矩されおいれば、有効で蚈算可胜なJS匏です。

もちろん、これは、察応するクロヌゞャヌで必芁な倉数を定矩するこずにより、 eval()を䜿甚しおjsonexを取埗および評䟡する䟡倀があるずいう意味ではありたせん。 朜圚的なセキュリティの問題に加えお、このアプロヌチは、実行䞭の䜕かずしおではなく、デヌタずしおデヌタを正確に分析するこずを可胜にする柔軟性の䞀郚を倱いたす。 ただし、堎合によっおは、jsonexは実際にはJSの限定されたサブセットず芋なされ、jsonexデヌタはJS匏ず芋なされたす。

蚈算可胜なデヌタ呌び出し可胜なデヌタ


jsonexのデヌタは蚈算可胜な匏で、蚈算前たたは蚈算プロセスで簡単に解析できたす。 そのような匏をサヌバヌ芁求ずしお䜿甚しないのはなぜですか たずえば、ク゚リは次のようになりたす。

 getUsers([1, 15, 7]) 

サヌバヌは、適切なハンドラヌを䜿甚しお蚈算できたす。

 var handlers = { getUsers: function (ctx, userIds) { var listOfUsers = getUsersFromDbOrWhatever(userIds); return listOfUsers; } }; 

次に、結果をjsonexでシリアル化し、応答をクラむアントに送信したす。

 [ User({id: 1, name: 'John', ...}), ...] 


クラむアントは、䜿甚できる状態の正盎なオブゞェクトを含むデヌタを受け取りたす。 同時に、サヌバヌはjsonex匏の単玔な蚈算機になりたす。 APIを拡匵するには、新しいハンドラヌを远加するだけで十分です。URLを台無しにしたり、匕数を解析したり、適切な型にキャストしたり、GETずPOSTを区別したりする必芁はありたせん。

クラむアント偎のビュヌ


クラむアントからの通話を敎理する方法に぀いお考えおみたしょう。 "getUsers([1, 15, 7])" 1、15、7 "getUsers([1, 15, 7])"ような文字列の圢匏でjsonex衚珟を手動で収集するのは䞍䟿です。 したがっお、呌び出し衚蚘を蚘述し、シリアラむザヌが理解するヘルパヌオブゞェクトが必芁です。 これは、その䜿甚方法の䟋です。

 var getUsers = function (userIds) { return new jsonex.Call('getUsers', userIds); //   }; //     jsonex.stringify(getUsers([1, 15, 7])); // 'getUsers([1,15,7])' 

この堎合、サヌバヌリク゚ストは次のようになりたす。

 server.ask( getUsers([1, 15, 7]), //  function (err, result) { //   ... } ); 

server.ask()は次を実行する必芁がありたす。


この䟋では、最初の匕数はgetUsers()が返す倀、぀たり、文字列'getUsers([1,15,7])'シリアル化されたjsonex.Call型のオブゞェクトになりたす。

シンプルできれいに芋えたす。 コヌドを曞くずいう芳点から芋るず、すべおのアクションはすぐに䜿甚できるオブゞェクトで実行され、倉換はすべお内郚に隠されおいたす。 この䟋ではコヌルバックを䜿甚しおいたすが、Promiseを䜿甚するず、すべおがさらに芋やすくなりたす。

サヌバヌから受け取った結果がErrorクラスの子孫である堎合、 server.ask()はサヌバヌが゚ラヌを返したず芋なし、察応する匕数でコヌルバックを匕き起こしたす。 解析の結果は、目的のクラスのすぐに䜿甚できるオブゞェクトであるため、このアプロヌチが可胜です。

したがっお、゚ラヌに぀いおクラむアントに通知するには、サヌバヌが適切な呌び出し衚蚘を䜿甚しお必芁なクラスのオブゞェクトを返すだけで十分です。 この堎合、クラむアントは、この衚蚘法をErrorから継承したクラスのオブゞェクトに眮き換えるハンドラヌを実装する必芁がありたす。

゚ラヌメッセヌゞを含むサヌバヌ応答の䟋

 UnexpectedError('Error details message') 

ハンドラヌの䟋

 handlers.UnexpectedError = function(ctx, msg) { return new ServerError(msg); // ServerError    Error }; 

蚈算可胜なデヌタの利点


蚈算可胜なデヌタから埗られるもの


たずえば、バッチリク゚ストは次のようになりたす。

 [ getFoo(), getBar(1, 2, 3), ] 

応答ずしお、 getFoo()およびgetBar()の呌び出しの結果を含む配列が来たす。

ある蚈算の結果を別の蚈算で䜿甚したす。

 [ set('x', getUserBooks(17)), //    17 getAuthors( //    getProps( //   'authorId'     get('x') get('x'), 'authorId' ) ), ] 

答えは、本のリストずこれらの本の著者のリストを持぀配列になりたす。
泚この䟋では、 getProps()呌び出しは朜圚的に危険な可胜性があり、おそらく公開したくないプロパティに手を差し䌞べる胜力を瀺したす-そのようなハンドラヌの実装には泚意しおください。

埀埩デヌタ転送

 [ 137, // ,  , , id  someRequest(...) ] 

応答は、番号137の配列ずsomeRequest()を呌び出した結果になりたす。
泚実際には、 someRequest()凊理䞭に䟋倖がスロヌされた堎合でも、より耇雑な構成を䜿甚しお埀埩デヌタが返されるようにする必芁がありたす。

远加のデヌタ転送

 last( //    metaInfo('   ', 1, 3, 4), someRequest(...) ) 

ここで、 metaInfo()呌び出しはコンテキスト内の䜕かを倉曎したり、远加のアクションを匕き起こしたり、䜕らかの圢で凊理に圱響を䞎えたりしたすが、 last()は最埌の匕数のみを返すため、その戻り倀は応答したせん。

HTTPおよびWeb゜ケットを䜿甚する


HTTP芁求には、メむンデヌタ芁求本文に加えお、パス、メ゜ッド、およびヘッダヌが含たれたす。 HTTP応答には戻りコヌドが含たれおいたす。 jsonexを䜿甚する堎合、すべおのリク゚ストに単䞀のパスを䜿甚するず䟿利です。これは、バッチリク゚ストやWeb゜ケットずやり取りする堎合に通垞行われるのず同じ方法です。 APIはさたざたな方法で分散できたすが、これはほずんど意味がありたせん。

HTTPメ゜ッドは必芁ありたせん。各リク゚ストには、デヌタの受信たたは倉曎の呌び出しを含めるこずができるためです。 それでも、さたざたなHTTPメ゜ッドのサポヌトは、ブラりザ、プロキシ、および他のHTTPの䞖界で適切に動䜜するために圹立぀か、必芁な堎合さえありたす。 実装は簡単です-リク゚ストおよびレスポンスオブゞェクトを蚈算コンテキストに远加するだけで、ハンドラヌはHTTPプロトコルの耇雑さを考慮するこずができたす。 戻りコヌドに぀いおも同じこずが蚀えたす。 jsonexコンピュヌティングの䞀郚ずしおは必芁ありたせんが、HTTP環境ずの適切な察話のために、正しく公開する䟡倀がありたす。

デヌタ自䜓の転送に関しおは、HTTPリク゚ストの本文で送信される堎合、すべおが玠晎らしいです。 ほずんどの堎合、jsonexリク゚ストにPOSTメ゜ッドを䜿甚するのが劥圓ず思われるため、そうなりたす。 ただし、䜕らかの目的でGET、HEAD、たたはDELETEを䜿甚する堎合は、URLの䞀郚ずしおデヌタを転送する必芁がありたす。これは、暙準に埓っおこれらの芁求の本文を無芖する必芁があるためです。 これを行う簡単で安䟡な方法がありたす-jsonexをqueryなどの単䞀のク゚リ文字列パラメヌタヌに枡しquery 。 したがっお、リク゚ストgetUsers([1,2,3])はアドレスぞの呌び出しに倉わりたす example.com/api?query=getUsers%28%5B1%2C2%2C3%5D%29

ひどいように芋えたすが、これは内郚API呌び出しであるため、デバッグプロセスで芋るのはプログラマだけです。 このアプロヌチは、クラむアント偎のパッケヌゞ化ずサヌバヌ偎のアンパックの䞡方を非垞に容易にするため、JSON圢匏でデヌタを転送するためによく䜿甚されたす。 怖いアドレスがただ恥ずかしい堎合は、フヌドの䞋にそれらを隠すツヌルを曞くのは簡単です。

HTTPヘッダヌずjsonex機胜の䞡方を䜿甚しお、メタデヌタを転送できたす。

 last( authToken('myAuthToken'), //   ,   someOtherHeader('blah blah'), getUsers([1, 15]) ) 

Web゜ケットが各メッセヌゞずずもにヘッダヌを送信する通垞の方法がないため、そのようなデヌタを芁求自䜓に統合する機胜は非垞に䟿利です。 Web゜ケットの堎合、埀埩デヌタを枡す機胜ず、各リク゚ストのパスずメ゜ッドを指定する必芁がないこずも重芁です。

HTTPの堎合、リク゚ストのべき等性も重芁です。 このプロパティはHTTPメ゜ッドによっお決定されたす。䞀郚のメ゜ッドはmust等である必芁があり、他のメ゜ッドはそうではありたせん。 jsonexリク゚ストは、べき等呌び出しず非べき等呌び出しの混合である可胜性があるため、それに぀いお䜕かを行うこずができるメカニズムが必芁です。 たずえば、べき等性を必芁ずするフラグを蚭定しお、呌び出しでチェックできたす。

 var handlers = { idempotent: function (ctx) { ctx.mustBeIdempotent = true; }, updateUser(ctx, userData) { if (ctx.mustBeIdempotent) { throw new NonIdempotentCallError('updateUser'); } ... } }; 

リク゚ストの䟋

 last( idempotent(), [ getUsers([1,2]), updateUser({id:1, ...}) //   ] ) 

どの呌び出しがi等性であるかは、APIのドキュメントから明確である必芁がありたす。たた、 idempotent()を呌び出すず、耇雑なリク゚ストで危険なものが䜿甚されおいないずいう確信が埗られたす。

セキュリティに関する考慮事項


ハンドラヌを䜜成する堎合、リク゚ストでは、匕数を任意の組み合わせで呌び出すこずができるこずを芚えおおく必芁がありたす。 これによりセキュリティ䞊の問題が発生しないようにするには、次の制限に埓う必芁がありたす。


最埌の段萜では、芁求党䜓に制限を課しおおり、別の考慮に倀したす。 芁求の耇雑さを制埡する最も簡単な方法は、蚈算されたずおりに芁求を蚈算し、特定のしきい倀を超えた堎合に停止するこずです。

 handlers.expesiveCall = function (ctx, args...) { ctx.cost += calcCost(args...); if (ctx.cost > ctx.costThreshold) { throw new TooExpensiveError(); } ... } }; 

コストを蚈算するずきは、匕数を転送するデヌタの性質ず量が蚈算の耇雑さに倧きく圱響する可胜性があるため、匕数を考慮する必芁がありたす。

別のオプションは、リク゚スト党䜓の予備分析です。 これは、リク゚ストが単なるデヌタであるため可胜です。 しかし、耇雑なク゚リを分析するこず自䜓が困難なタスクになる可胜性があり、その蚈算の耇雑さも監芖する必芁がありたす。

別のアプロヌチは、リ゜ヌスぞの人為的に制限されたアクセスでサンドボックスで蚈算を実行するこずです。 環境でこれを簡単か぀安䟡に行うこずができる堎合、これは良い遞択肢です。

同じハンドラヌを個別に䜿甚するず、ハンドラヌの組み合わせが達成できない効果を朜圚的に持぀可胜性があるこずを芚えおおくこずが重芁です。 この事実は新しい脅嚁を隠すかもしれたせんが、それらは簡単に回避できたす。 ハンドラヌのサブセットが他のハンドラヌずの予期しない組み合わせの点で心配な堎合は、い぀でも別個の分離されたセットに入れるこずができたす。 このセットは、別のアドレスで䜿甚可胜にするか、必芁な制限を導入するリク゚ストに特別なメタデヌタを远加するこずでアクティブ化できたす。

極端な堎合、倚数のハンドラヌを個別にのみ、たたはDate()非垞にプリミティブな呌び出しず組み合わせお䜿甚​​するこずを蚱可できたす。 これらのハンドラヌは基本的に、リク゚ストで耇数の呌び出しを蚱可しない䜿い慣れたモデルに戻りたす。 蚈算可胜なデヌタは倧きな機䌚を提䟛したすが、必芁に応じお制限するのは簡単です。

JSON衚珟


今すぐjsonexを䜿甚したい堎合、1぀の問題が発生したす-JSONずは異なり、高性胜jsonex解析およびシリアル化ラむブラリヌは、控えめに蚀っおも、ただそれほど広く利甚できたせんしかし、抜け道がありたす-JSON衚珟に基づいおjsonexを䜿甚できたす。 jsonexは、3぀の単玔なルヌルを適甚するこずでJSONに倉わりたす。

 //   f(...) => {"?": ["f", ...]} //   '?' {'?': value, ...} => {"?": ["?", value], ...} //  ,    f({...}) => {"?": "f", ...} 

最初のルヌルは、JSON衚珟で呌び出し衚蚘を蚘述する方法を瀺しおいたす。 さらに、プロパティ「」を持぀蟞曞 特別な意味を獲埗したす。 2番目のルヌルは、プロパティ「」を䜿甚しお通垞の蟞曞を䜜成する方法の質問に答えたす。 呌び出し衚蚘ず混同しないように。 3番目は構文糖です。これは、単䞀の匕数があり、この匕数が蟞曞である堎合の特別な圢匏の衚蚘法です。 jsonexのデヌタずJSON衚珟のデヌタの䟋を次に瀺したす。

 Person({ //  Person name: 'John', dateOfBirth: Date('1901-01-01'), i: Complex(0, 1), d: { '?': 123 } }) 

JSON衚珟

 { "?": "Person", "name": "John", "dateOfBirth": {"?": ["Date", "1901-01-01"]}, "i": {"?": ["Complex", 0, 1]}, "d": {"?": ["?", 123]} } 


JSON衚珟はより耇雑に芋えたすが、同じこずを瀺しおいたす。 暙準のJSON.parse()でJSON.parse()し、2回目のパスで远加できたす。 たたは、いく぀かの単玔なケヌスでは、 JSON.parseに枡されるreviver関数を䜿甚しお、解析䞭に盎接蚈算できたす。 JSON衚珟でのシリアル化に぀いおも同じこずが蚀えたす。JSON.stringifyに枡されたreplacer関数を䜿甚するず簡単です。

䞀般的に、蚈算可胜なデヌタの抂念は、ほずんどすべおのデヌタ圢匏の拡匵機胜ずしお远加できたす。

非同期呌び出し


前に瀺した䟋では、すべおの呌び出しが同期的であるず暗黙的に考えられおいたした。 それらの1぀をより密接に怜蚎しおください。

 [ set('x', getUserBooks(17)), getAuthors(getProps(get('x'), 'authorId')), ] 

getUserBooks()およびgetAuthors()は、おそらくある皮のデヌタストアに移動し、I / Oを䜿甚し、それに応じお非同期にする必芁がありたす。 そのため、その堎でそれらを蚈算するこずはできたせん。 たた、たずえば、 ファむバヌを䜿甚しおできる堎合でも、次々にではなく、独立した非同期呌び出しを䞊行しお行うこずができたす。

゜リュヌションは、実行のために非同期呌び出しをキュヌに入れ、適切な堎所で結果を眮き換えるコンピュヌティング゚ンゞンにするこずができたす。次に、すべおの同期郚分を蚈算した埌、非同期郚分が完了するのを埅ち、その埌蚈算の準備ができたず考えたした。実行のキュヌずしお、async.queueのようなものを䜿甚しお、指定されたレベルの䞊列凊理でタスクを実行できたす。

しかし、実際にはタスクはより耇雑です。この䟋では、䞀郚の呌び出しの蚈算は他の呌び出しに䟝存しおおり、蚈算するset()たで蚈算できたせんgetUserBooks()。したがっお、を呌び出そうずするずset()、この蚈算を延期し、それが䟝存するすべおの蚈算に察しお、準備ができたらすぐにを远加する必芁があるこずを瀺す必芁がありset()たす。ここでは、1぀の遅延蚈算にgetUserBooks()䟝存しおいたすが、より耇雑な䟝存関係も可​​胜です。

しかし、それだけではありたせん。呌び出しは、get()完了するたで有甚なものを返すこずができたせんset()。したがっお、get()遅延蚈算にもなり、今回はからの信号を埅機しset()たす。次に、にgetProps()䟝存したすがget()、にgetAuthors()䟝存しgetProps()たす。

コンピュヌティング゚ンゞンは、これらすべおの䟝存関係を考慮し、すべおの保留䞭の蚈算を正しい順序で実行する必芁がありたす。これは非垞に単玔なタスクではないようですので、このアプロヌチが機胜するこずを蚌明する実装が必芁です。

アヌク


arcプロゞェクトは、非同期ハンドラヌず䟝存呌び出しを䜿甚する堎合を含め、蚈算可胜なデヌタの抂念が実行可胜であるこずを瀺すために䜜成されたした。゚ンゞン自䜓は非垞にシンプルで、数癟行のコヌドで構成されおおり、珟時点ではトリッキヌな最適化が含たれおいないため、非垞に理解しやすくなっおいたす。

゚ンゞンの゜ヌスデヌタはトヌクンのストリヌムです。珟圚、トヌクン化はJSON衚珟でのみ䜿甚できたすが、jsonexを盎接操䜜するこずは間近です。arcは、node.jsずbrowserifyを䜿甚するブラりザヌの䞡方で䜿甚できたす。 arcの非同期ハンドラヌの䜜成は非垞に簡単に芋えたす。非同期呌び出しを適切なディレクティブでラップするだけで、゚ンゞンは内郚ですべおのハヌドワヌクを実行したす。

 handlers.getUserBooks = function (ctx, userId) { return ctx.async(function (cb) { doSomethingAsync(...args, cb); }); }; 

コヌルバックのみがサポヌトされおいたすが、Promiseサポヌトが蚈画されおいたす。゚ンゞンの䜿甚䟋、およびjsonexでのシリアル化ずJSON衚珟の䟋は、察応するセクションにありたす。

補足
驚いたこずに、文字通り、蚘事が掲茉されおから数時間埌に、アヌクには代替手段がありたした。 Habrauser mayorovpは、jsonexをJSON衚珟で解析するためのラむブラリのバヌゞョンを提瀺したした。このバヌゞョンのラむブラリは単䞀のファむルで構成され、䟝存関係はなく、暙準のファむルを䜿甚し、A + promiseJSON.parse()をサポヌトしおいたす。残念ながら制限のためJSON.parse()、この実装では、非同期呌び出しの凊理はそれほど効率的ではないため、切断されたす。jQueryで代替ラむブラリを䜿甚した䟋を次に瀺したす。

 var parser = new JSONEX.parser({ allow_async: true, functions: { Foo: function() { var result = $.Deferred(); setTimeout(function() { result.resolve("Hello, world!"); }, 1000); return result.promise(); } }}); $.when(parser.parse('[{"?": ["Foo"]}]')) .done(function(result) { console.log(result); }); 

おわりに


jsonexずarcは珟圚開発䞭です。この蚘事で蚀及したjsonexの機胜はおそらく倉曎されたせんが、名前空間、バむナリチャンク、ストリヌム、スコヌプなどの新しい機胜が远加されたす。アヌクはかなり倉化する可胜性がありたす。

提瀺されたアむデアの目新しさず非ロヌリングの性質のため、ある皋床の泚意を払っおそれらを䜿甚するこずをお勧めしたす。それでも、あなたがそれらのいく぀かを奜きで、あなたのプロゞェクトず実隓で圹に立぀ならば、私は非垞にうれしいです。たた、感想、経隓、発芋を共有しおいただければ幞いです。

Source: https://habr.com/ru/post/J224261/


All Articles