ICL Services EM
Giga Contributor

非同期処理を使うのはどうして要るのでしょうか。

 

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 PromisesPath to ES6, ES7? 

 

人気があるNodeJSなど、サーバサイドJavaScriptのエンジンで非同期スタイルがどのように実現されているか確認してみましょう。

Node.js 非同期処理・超入門 -- Promiseとasync/await

https://developer.ibm.com/technologies/node-js/articles/promises-in-nodejs-an-alternative-to-callbac...

https://nodejs.dev/modern-asynchronous-javascript-with-async-and-await

https://github.com/then/promisehttps://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

Version history
Last update:
‎05-13-2020 11:53 AM
Updated by: