- Post History
- Subscribe to RSS Feed
- Mark as New
- Mark as Read
- Bookmark
- Subscribe
- Printer Friendly Page
- Report Inappropriate Content
on 05-13-2020 11:53 AM
非同期処理を使うのはどうして要るのでしょうか。
MDNガイドによると、
JavaScriptは、基本的な形式にとって、同期、同時に1つ操作しか実行できなくて、シングルスレッドの言語です。Webブラウザーは、イベントが発生したときに、同期実行されなくて、非同期に呼び出すべきな関数を登録できるようにする関数とAPIを定義します。例えば、時間の経過、ユーザーがしたマウスイベント、サーバーから応答情報の到着などのイベントです。つまり、メインスレッドを停止やブロックしなくて、同時にコードでいくつかの操作を実行できます。
非同期関数の主な考え方は、関数の終了後に、メインスクリプトの実行とは無関係にコールバック関数の中で処理できる結果を返すことです。
基本の実現
Javascriptで次の非同期処理スタイルがあります:非同期処理:コールバック/Promise/Async Function
Promiseの実現:Standard ECMA-262 6th Edition / June 2015 ECMAScript® 2015 Language Specification
Async/Awaitの実現: ECMAScript® 2017 Language Specification (ECMA-262, 8th edition, June 2017)
詳細は以下に見つかれます:
JavaScriptはシングルスレッドで実行される、非同期処理ってどういうこと?JavaScriptで一から学ぶ、
Promiseの直列処理をループする、Promiseを複数組み合わせる時の基本パターン(直列、並列、分岐)
非同期処理を理解する、async/await 入門(JavaScript)、JavaScriptの非同期処理はasync/await/Promise、
JPromise, async/awaitを使ったJavaScriptの非同期処理、JavaScriptのasync/awaitを完全に理解する
JQueryに関して、PromiseとしてDeferredオブジェクトが使われています:https://api.jquery.com/deferred.promise/
AngularJS 1.x は「$q」 というコンストラクタを適用しています: https://docs.angularjs.org/api/ng/service/$q
ServiceNowにとっては?
クライアントサイドには、JQueryとAngularJSの非同期処理の関数やGlideAjaxなど、すぐに使えるサーバーサイドに非同期呼び出しできる方法などがあります:The Async Fight - getReference and GlideRecord.
サーバーサイドで適用できる非同期方法があるかどうか調べましょう。
コンミュニティのメンバーも気になっているそうです:
Asynchronous Computing with JavaScript Promises、Path to ES6, ES7?
人気があるNodeJSなど、サーバサイドJavaScriptのエンジンで非同期スタイルがどのように実現されているか確認してみましょう。
Node.js 非同期処理・超入門 -- Promiseとasync/await、
https://nodejs.dev/modern-asynchronous-javascript-with-async-and-await、
https://github.com/then/promise、https://www.promisejs.org/
ServiceNowは、Standard ECMA-262 5.1 Edition / June 2011のみに対応しているMozilla Rhinoエンジンの1.7 R5バージョンを使います: https://docs.servicenow.com/bundle/orlando-application-development/page/script/JavaScript-engine-upg...
https://mozilla.github.io/rhino/compat/engines.htmlによると、現時点では、Rhinoエンジンが非同期処理をサポートしていないそうです。
これにもかかわらずに、いくつかのソリューションがあるそうです。
https://www.promisejs.org/implementing/には、setTimout()が使われるPromiseの実現方法は説明されています。サーバサイドにsetTimout()を実現方法が以下に提案されています:https://stackoverflow.com/questions/2261705/how-to-run-a-javascript-function-asynchronously-without-...、https://gist.github.com/hns/375799
まとめ
残念ながら、ベンダーじゃないな開発者は、使えるJS機能のリミットがあるので、Rhinoネイティブ構文を使用して上記の方法をテストすることはできませんが、ベンダー開発者にとって、バックエンドのServiceNowライブラリにPromise機能を追加できるかどうか調べるのでしょうか。
少なくとも、すぐに使えるRhinoのサポートを待つことより、カスタム実現方法を見つけるのほどは、最適になるでしょうか。
オシポワ オリガ
ITエンジニア
ICL Services
