JAvascript非同期とpromise


同期非同期シリーズの文章はjavascript非同期javascript非同期中のコールバックjavascript非同期のPromiseについて話すことをお勧めします.all()、Promise.race()、Promise.finally()javascript非同期のPromise.resolve()、Promise.reject()javascript非同期のPromise thenとcatch javascript非同期のasync(一)javascript非同期のasync(二)javascript非同期実戦javascript非同期総括アーカイブ
Javascript非同期を処理する最も一般的な方法はコールバック関数を通じて、コールバック関数について昨日紹介しました.私たちは一般的にネストコールバックまたはチェーンコールバックを使用して、以下の問題が発生します.
  • ネストコールバックを使用すると、階層が多すぎて、
  • のメンテナンスに不利になります.
  • だからチェーンコールバックを採用し,ネストコールバックを分割し,分割後の関数間結合度が高く,
  • であった.
  • パラメータを渡す必要がある場合、関数間の関連性が高くなり、コードの堅牢性を向上させるためにパラメータを検証する
  • .
  • 独自のコールバック関数をサードパーティ製プラグインまたはライブラリに渡す場合は、制御不能な要素を考慮する必要があります.
  • コールバックが早すぎる
  • 呼び出しコールバックが遅すぎる(または呼び出されない)
  • コールバック回数が多すぎるか少なすぎる

  • promiseの存在は以上の問題を解決するためである.私たちは日常的にコールバック関数を書くのにこのような厳しい要求はないが、このようにコールバック関数を書かないと、隠れた危険性があり、チームが協力するとき、符号化規範が特に重要であるように見える.
    本文はpromiseの使用方法を重点的に紹介しないで、promiseがどのような非同期コールバックの問題を解決したかを重点的に紹介します.
    promiseとは
    promiseを理解するのに役立つシーンを見てみましょう
    このシーンを想定して、私はKFCに行って、レジに10元渡して、ハンバーガーを注文して、注文して支払います.ここまで来て、私はもう1つの要求(ハンバーガーを買う)を出して、取引を開始しました.
    しかし、ハンバーガーを作るには時間がかかります.私はすぐにこのハンバーガーを手に入れることができません.レジはハンバーガーの代わりに領収書をくれました.ここまで来ると、領収書は約束(promise)で、最後にハンバーガーを手に入れることができることを保証します.
    だから私はこの領収書をちゃんと残す必要があります.私にとって、領収書はハンバーガーです.この領収書は食べられませんが、ハンバーガーができるのを待つ必要があります.レジの人が番号を呼んで知らせてくれるのを待つ必要があります.
    待っている間に、私は他のことをすることができます.
    レジがやっと私の番号を呼んで、領収書でハンバーガーに変えました.
    もちろんもう一つ、カウンターにハンバーガーを取りに行ったとき、レジの人がハンバーガーが売り切れたとか、ハンバーガーを作っている師匠が怪我をしたとか、原因でこのハンバーガーが手に入らなかったとか教えてくれました.
    領収書は持っていますが、ハンバーガーがもらえるかもしれないし、ハンバーガーがもらえないかもしれません(失敗)
    私はハンバーガーを待つことから待つことになったが、この過程は不可逆的で、
    上ではpromiseをイメージして紹介しています.上のハンバーガー待ちとハンバーガーを手に入れました.ハンバーガーは売り切れました.ハンバーガーが得られません.それぞれpromiseの3つの状態に対応しています.pending(進行中)、fulfilled(成功しました)、rejected(失敗しました)(状態が変わると、二度と変わりません)
    コールバック関数の呼び出しが早すぎる
    呼び出しが早すぎると非同期関数を同期として処理します.javascriptは単一スレッド同期でプライマリスレッドを実行し、非同期に遭遇すると非同期関数をタスクキューに格納します.プライマリスレッドの実行が完了すると、タスクキューの関数数、つまりイベントループがタスクキューが空になるまで実行されます.
    イベントループとタスクキュー
    イベントループは遊園地のようなもので、ゲームをした後、列の最後に並べ直す必要があります.タスクキューは、ゲームをした後、列に割り込んで遊ぶことができます.
    栗を見てみましょう
        const promise = new Promise((resolve, reject) => {
          resolve("   ")
        });
        promise.then(res => {
          console.log(res);
          console.log("       ");
        })
        console.log('     ');

    出力を見て、出力順序に重点を置く
    //     
    //   
    //       

    直接手動はpromiseの状態を成功状態に切るlog(「私は非同期で実行しています」);このコードも、then()に提供される非同期実行のコールバックは、常に非同期実行であるため、promiseではコールバック関数が早期に実行されることはありません.
    コールバック関数の呼び出しが遅すぎたり、呼び出されなかったり
    コールバック関数の呼び出しが遅すぎます
    コールバック関数の呼び出しが遅すぎる処理原理は呼び出しが早すぎるのと似ており、promiseのthen()には非同期関数が格納されており、すべての非同期はjsのタスクキューに存在し、jsのメインスレッドが実行されると、タスクキューの内容が順次実行され、実行が遅すぎることはありません.
    コールバック関数は呼び出されません
    私たちは栗で話します.
        const promise = new Promise((resolve, reject) => resolve('   '))
        promise.then(s => console.log(s));
        console.log('     ');

    成功状態の出力
    //     
    //   

    成功した状態でコールバックが呼び出され、失敗したコールバックを見続けます.
        const promise = new Promise((resolve, reject) => reject('   '))
       promise.then(null, s => console.log(s));
       console.log('     ');

    失敗状態の出力
    //     
    //   

    失敗した状態でコールバックが呼び出されるので、失敗しても成功してもコールバック関数が呼び出されます.
    コールバック関数の呼び出し回数が多すぎるか少なすぎる
    呼び出し回数が多すぎる
    前にpromiseには3つの状態pending(進行中)、fulfilled(成功)、rejected(失敗)がありますが、状態が変わると栗は1つも変わりません
        const promise = new Promise((resolve, reject) => {
          reject('   ')
          resolve('   ')
        });
        promise.then(res => {
          console.log(`         :${res}`);
        },err=>{
          console.log(`         :${err}`);
        }).catch(err => {
          console.log(err);
        })
        console.log('     ');

    しゅつりょく
    //     
    //         :   

    ステータスが失敗になると、成功にはなりません.成功した関数も実行されません.逆も同様です.
    呼び出し回数が少なすぎる
    コールバック関数は通常1回呼び出され、少なすぎる=>0回=>コールバック関数は呼び出されません.
    テキストリンク
    参考リンクJavaScript PromiseミニブックPromiseオブジェクトES 6シリーズPromiseについて