ジャバスクリプトはカジノでギャンブルによって説明される


ギャンブルやギャンブルについての映画を見たことがある場合は、JavaScriptで約束を理解することができます.
JavaScriptの非同期機能が大好きです.実際には、私たちは非常に多くのことが時々、私たちを無視します.そして、“pyramid of doom”のようなコードを取得します.

Image Credit
これは一般的に「コールバック地獄」として知られています.なぜなら、おそらくそのコードを再読み込みしたくないし、どのように動作しているのか、どのようなシーケンスで動作するのかを理解しようとするからです.実際、あなたのチームの誰もしません.
上の例にはいくつかのことが難しいです.
  • エラー処理が不明瞭です.何かが間違っている場合はどうなりますか?
  • 各関数は前の関数に依存します.非同期式を必要としません.あなたは他のコードを読んで注文を明確にしたい.この多くの関数をチェーン化すると、同期式のコードが読みやすくなります.
  • あなたは継続的に関数の入力のための変数を追跡し、出力する必要があります.また、各出力に発生するロジックを追跡します.これが疲れる.
  • この全体のプロセスを約束を使用して理解することができます.あなたが私のようであるならば、あなたは一度か二度約束を聞いたかもしれません、しかし、彼らが混乱しているようだったので、それから彼らを無視しました.あなたがコールバックを理解するならば、約束の基本的な用途は実際に非常に簡単です.
    明確なコードを記述し、頭痛なしですべてのステップを理解できるようになります簡単な、単一目的の機能をお約束します.しばらく考えた後、私は約束はカジノへの旅行のようだと気づいた.一方、カジノはあなたの銀行口座(AHEM、削除)のお金の量を変更すると、約束の連鎖は、特定のシーケンス内のデータを変更します.

    それで、それに飛び込みましょう.あなたがコールバックで経験がないならば、my explanation on the principles of callbacksをチェックしてください.あなたが約束のより技術的な説明を探しているならば、this guideまたはthis guideまたはチェックアウトしてください.

    約束は何ですか。


    あなたがカジノに週末休暇をとっていると言いましょう.あなたはあなたのポケットに給料の2週間を持って、あなたはそれを賭けるように、すべての瞬間を楽しむには、最後のダイムにダウンします.それとも、幸運を取得し、お金を獲得終了?
    あなたのホテルの部屋にして、カジノに頭を取得します.ゲームの各タイプは現金を受け入れるので、あなたは1000ドルを撤回し始めるためにATMに行く必要があります.
    一歩踏み出してこのシナリオを考えましょう.現金はカジノの外の何かのために使用することができますが、それはあなたがお金を使い果たす前に残っているゲームの数-内部の1つのことを意味します.そのキャッシュ量は、週末のコースの上でさらにさらに縮小するでしょう.また、成長することができますが、あなたはすでにあなたがこの週末1000ドル以上失うことはありません自分自身を約束している.

    あなたの残りのお金の量は、上記の図のゲームからゲームに渡される方法に注意してください?
    約束は、まだ存在しない価値の場所を保持しますが、将来確かに存在します.これは明らかに機能に従って、その始まりと終わりを理解することができます.上記のように、約束は連続的な非同期機能に明快さを与えて、入力と出力をはっきりさせるすばらしい方法です.
    約束は、1つの非同期機能の製品を直接次の機能に渡します.前の関数が値を返すとすぐに、その関数は始まります.または、エラーを返すと、別の関数を実行します.私たちは後でその偶発性をカバーすることができます.

    あなたの最初の約束を作成する


    実際には生産者と消費者の2種類の約束があります.
    生産者はチェーンの最初の約束です、一方、消費者はチェーンの前の約束から結果を待ちます.この場合、ATMに行くことは生産者です.
    また、約束は3つの州のいずれかを持つことができます.
    未定の
  • -まだ完了していない
  • 満たされる
  • -見込みは完了して、価値
  • を返しました
  • は拒否されました-約束はエラーで失敗しました.
  • それで、あなたがATMを訪問して、あなたが意図した操作を完了することができないならば、...$ 1000を正常に引き出すと、値を返しました.

    では、これをコード化しましょう.これが約束構文です.
    let withdraw = new Promise(function(resolve,reject){
    
      let amount = visitATM(1000);
      return resolve(amount)
    });
    
    そして、そのコードの行ごとの説明です.

    行1 - 2つの可能な結果で約束を宣言します
    第2行- ATMからお金を引き出す機能
    行3 - VisiTatm関数から値を設定した状態を返す
    他の非同期コードと同様に、このアプローチでは、コードがVisutatm関数の状態で待機できます.が完了していない場合は継続するポイントはありません!

    複数約束の連鎖


    あなたがカジノにいる間、スロット、ポーカー、ルーレットをプレイしたいと仮定しましょう.一人一人が現金経由で購入する必要があります.もちろん、ポーカーであまりにも多くのお金を賭けて実行すると、次のいずれかのゲームをプレイすることができなくなります.
    のは、スロットを最初に再生したいとしましょう.
    let withdraw = new Promise(function(resolve,reject){ 
    
      let amount = visitATM(1000); 
    
      return resolve(amount) 
    }); 
    
    withdraw.then(function(amount){
      let slotResults = playSlots(amount, 100);
    
      if(slotResults <= 0)
        throw err;
    
      return slotResults;
    });
    
    約束を使用します.次に、前の約束の後に何が起こるかを示す構文を解決します.この場合、withdraw見込みの最終結果は量の範囲内で含まれる.
    それで、我々が使用する次の約束を始めるとき.next ()は、以前の結果に対応する引数の量を示します.
    つの他の重要な注意-プレイスロットは、構成された機能です.我々は、それは2つの引数-あなたが持っているお金の総量、およびギャンブルを気にしている額の2つの引数を取る想像している.

    この約束のチェーンに別のステップを追加しましょう-ポーカーのゲーム.それは同様にスロットマシンの約束に動作します.我々は、我々がこれの中で望む限り、我々を賭けます.
    withdraw.then(function(amount){
      let slotResults = playSlots(amount, 100);
    
      if(slotResults <= 0)
        throw err;
    
      return slotResults;
    })
    .then(function(slotResults){
      let pokerResults = playPoker(slotResults);
    
      if(pokerResults <= 0) 
        throw err; 
    
      return pokerResults;
    })
    
    だから、我々は、ポーカーゲームにスロットマシンをプレイした後、現金が残ってフィード.あなたが私に尋ねるならば、かなり積極的です.

    この部分のコード図を示します.

    我々が今我々のすべてのお金を賭博したと想像しましょう.我々は当初より多くのゲームをプレイするつもりだったが、我々はお金が残っている.この鎖にはさらに約束があるかもしれませんが、解決できません.
    代わりに、私たちはポーカーの後に残った$ 0を持っているので、この約束はエラーをスローします.それはまだ解決されます、しかし、拒絶された状態で.
    これはどこです.catch ()メソッドは便利です.キャッチは、我々の約束のチェーンで発生する可能性のあるエラーを処理することができます.それぞれのコールバックにエラーハンドラを書く必要はありません.
    あなたがあなたのすべてのお金を賭博したとき、あなたがまっすぐバーに向かうと想像しましょう.ここでは、コードでどのように見えます.
    withdraw.then(function(amount){
      let slotResults = playSlots(amount, 100);
    
      if(slotResults <= 0)
        throw err;
    
      return slotResults;
    })
    .then(function(slotResults){
      let pokerResults = playPoker(slotResults);
    
      if(pokerResults <= 0) 
        throw err; 
    
      return pokerResults;
    })
    .catch(function(e){
      goToBar();
    });
    
    このキャッチフレーズは、どの約束が拒否されるかに関係なく動作します.

    約束内のオブジェクトの使用


    これまでのところ、我々の約束は数を返しただけだ.しかし、それらはチェーンに沿った他のタイプのデータを渡すこともできます.
    あなたがスロットマシンをプレイし、いくつかのお金を獲得想像してみましょう.スロットマシンはまっすぐ現金を与えることはありません-それはあなたが後で償還することができますチケットを与える.これはticket-in, ticket-out systemと呼ばれている.
    今、あなたはチェーン上の2つの値を追跡する必要があります-手に現金の量、およびあなたのチケットの値.オブジェクトはこの状況で最もよく働くでしょう.
    あなたがスロットをプレーしたチェーンの2番目の約束を変更しましょう.
    withdraw.then(function(amount){
      let ticketValue = playSlots(amount, 100);
    
      if(ticketValue <= 0)
        throw err;
    
      return {tickets: ticketValue, cash: amount};
    });
    
    現在、2つのプロパティを持つオブジェクトを返します.以下のようになります.

    ポーカーテーブルのみチップの現金を受け入れるので、次の約束でそのプロパティを使用する必要があります.
    withdraw.then(function(amount){
      let ticketValue = playSlots(amount, 100);
    
      if(ticketValue <= 0)
        throw err;
    
      return {tickets: ticketValue, cash: amount};
    })
    .then(function(slotResults){
      let pokerResults = playPoker(slotResults.cash);
    
      if(pokerResults <= 0) 
        throw err; 
    
      return {tickets: slotResults.tickets, cash: pokerResults};
    })
    .catch(function(e){
      goToBar();
    });
    
    いくつかのことに注意してください.
  • 私はポーカーゲームで現金値を使用しました.しかし、最後に、私はまだチェーンに沿ってそれを渡すために、最終的なオブジェクトにチケット価値を加える必要があります.さもないと、私は賞金をなくしただろう.
  • SlotResultsは、そのオブジェクトが名前を持っていなくても、前の約束からオブジェクトを含んでいます.
  • 最新のチュートリアル


    あなたはこの説明を楽しんだか.HTML、CSSとJavaScriptの最新の視覚化されたチュートリアルを得るために、CodeAnalogies blogをチェックしてください.