一般的な信念に反して、VoximplantクラウドはNode.jsを使用して、クライアントのJavaScriptコードを音声およびビデオコールと並行して実行しません。 各サーバーは、数百のコールを同時に管理します:コール間での音声およびビデオストリームの切り替え、録音、音声認識、合成、外部サーバーへのHTTPリクエスト-これがすべてです。 また、Node.jsは単独で動作するように設計されています。 数百の孤立したインスタンス-これは彼女に関するものではありません。 記憶、資源のために戦うと、それは非常に悲しいことに終わります。 したがって、1つの小さなセッションでクライアント側のJavaScriptコードがサーバー全体の動作を妨害することを防ぐ、
非常に隔離されたリソース制限のあるサンドボックスがあります。 同様の理由でアスタリスクは使用しません。
最近まで、ES5構文をサポートしていました。 典型的な通信シナリオは、数百、最大、千行のコードです。 顧客はまだ自分のバックエンドで複雑なものを作成しており、最新の構文が必要な場合は、いつでもトランスパイラーを使用し、
継続的インテグレーションを使用してアセンブルされたJavaScriptを自動的にロードできます。
しかし、2017年は拘束力があり、顧客はWebエディターとデバッガーを愛用して使用し、適切なソリューションを迅速に作成します。 そのため、ES2017のサポートを(もちろんゼロからではなく、既製のコンポーネントで)洗い流し、最新の方法でトレーニング資料を作り直しました。 カットの下で、最新のJavaScript表記を使用すると、コードが
どれだけ短く、より理解しやすくなるかを示したいと思います。 その違いは印象的です。
非同期および待機
私たちのAPIはかなり長い間約束を返してきたので、可能な場合は、パラメーターのチェーンが読みやすい線形コードに変わります。
| // |
| VoxEngine.addEventListener(AppEvents.Started, async function(e) { |
| var text1, text2, text3; |
| Net.httpRequestAsync("www.ru") |
| .then(function(e) { |
| text1 = e.text; |
| return Net.httpRequestAsync("ya.ru"); |
| }) |
| .then(function(e) { |
| text2 = e.text; |
| return Net.httpRequestAsync("mail.ru"); |
| }) |
| .then(function(e) { |
| text3 = e.text |
| doSomething(text1, text2, text3); |
| VoxEngine.terminate(); |
| } |
| }); |
| // |
| VoxEngine.addEventListener(AppEvents.Started, async e => { |
| const {text: text1} = await Net.httpRequestAsync("www.ru"); |
| const {text: text2} = await Net.httpRequestAsync("ya.ru"); |
| const {text: text3} = await Net.httpRequestAsync("mail.ru"); |
| doSomething(text1, text2, text3); |
| VoxEngine.terminate(); |
| }); |
矢印関数と破壊
コードを短くするだけです。 特に、一時的な識別子を削除し、必要なものだけを残します。
| // before |
| call.addEventListener(CallEvents.MessageReceived, function(e) { |
| var headers = e.headers; |
| var text = e.text; |
| doSomething(text, headers); |
| }); |
| |
| // after |
| call.addEventListener(CallEvents.MessageReceived, e => { |
| const {headers, text} = e; |
| doSomething(text, headers); |
| }); |
letとconst
リンター、自動ビルド、自動テスト、自動加熱がある場合に適しています。 しかし、実際には、スクリプトにすばやくアクセスして、Webエディターから何かを変更する必要があることがよくあります。 新しいletおよびconstを使用すると、開発者を「子供」のエラーから保護するコードを作成できます。
| // before |
| VoxEngine.addEventListener(AppEvents.CallAlerting, function(e) { |
| var callIn = e.call; |
| var callIn = VoxEngine.callPSTN("+71234567890"); // bug |
| callIn.addEventListener(CallEvents.Connected, function(e) { |
| VoxEngine.sendMediaBetween(callIn, callOut); |
| }); |
| }); |
| |
| // after |
| VoxEngine.addEventListener(AppEvents.CallAlerting, e => { |
| const callIn = e.call; |
| const callIn = VoxEngine.callPSTN("+71234567890"); // bug found! |
| callIn.addEventListener(CallEvents.Connected, e => { |
| VoxEngine.sendMediaBetween(callIn, callOut); |
| }); |
| }); |
補間付きの文字列リテラル
コードを読みやすくし、ツールチェーンがない場合に多くの子供たちの間違いから保護します。 はい、ツールチェーンなしでJSで開発するのはマナーが悪いことを知っています。 しかし、サービスに何千もの顧客があり、多くの主要なビジネスがプログラミングとはまったく関係がない場合、例と最初の実験の段階ですでにそれらを保護したいと思います。 Voximplantの「トリック」の1つは、会社が独自のフルタイムのWeb開発者を雇うことができることであり、あまりクールではなく、数時間で「レゴブロック」から必要な電話オートメーションを簡単に組み立てることができます。 キューブが彼の手で爆発しようとしないようにしたいです。
| // before |
| call.say("" + name + ", " + order + " "); |
| |
| // after. Watch the spaces! |
| call.say(` ${name}, ${order} `); |
サイクル、クラス、ヘルパー、その他のささいなこと
プラットフォームのシナリオのほとんどは非常に「軽量」です。バックエンドへのリクエスト、必要に応じてコールをルーティングし、不要なものをCRMに表示、購入または配信の確認を伴う自動コール、さまざまな条件に適した相手を選択します。 しかし、一般的に私たち自身のバックエンドなしで行い、通信だけでなく、これらの通信のビジネスロジックでもクラウドにすべての作業を行わせることは常に素晴らしいことです。 スクリプトがサンドボックスの境界に収まり、サーバーリソースを食い止めようとしない限り、通常は気にしません。 すべての構文シュガーES2017のネイティブサポートにより、TypeScript、テスト、およびデプロイからコンパイラを構成する必要なく、スクリプトにロジックをすばやく追加できます。 そうすれば、もちろんこれはすべて痛いことはありません-しかし、ここで、そして今では最小限のコード行でオンラインエディターで難しいことをする能力は大いに役立ちます。