このようにプロモーションを理解します

5674 ワード

プロモーションは何ですか
promiseは特別な作業の最終結果を表します.
翻訳==promiseを一つのステータスマシンとして理解できます.三つの異なる状態があり、ある時点で一つの状態しかありません.
  • ペンディングはまだ実行されているということです.
  • レシオ実行成功
  • レジェクト実行失敗
  • 一つのpromiseは一つの非同期操作のパッケージで、非同期操作は完成、成功、失敗の三つの可能性がある結果を待って、promiseの3つの状態に対応しています.
    promiseの状態は、pending変換ビットreolvedまたはpendingからrejectiedに転換するしかなく、一旦状態が転化されたらもう変えられない.
    プロミスで非同期的な操作を封じたとすると、作成された時点でpending状態になり、非同期操作が成功した時には、状態をrevovedに変換します.実行中にエラーが発生したら、状態をrejectに変換します.
    var promise=new Promise(function(resolve,reject){
      // code
      if(){
        /*       */
        resolve(value)
      }else{
        reject(error)
      }
    })
    thenメソッドを使って結果を取得します.
    var fs=require('fs')
    function readFile_promise(path){
      return new Promise(function(resolve,reject){
        fs.readFile(path, 'utf-8',function(err,data){
          if(data){
            resolve(data)
          }else{
            reject(err)
          }
        })
      })
    }
    
    var result=readFile_promise('./1.txt')
    result.then(function(value){
      //success
      console.log('success', value)
    },function(error){
      //failure
      console.log('failure',error)
    })
    //           promise,                   resolve  reject  。
    
    // resolve                ,                   。
    // reject              ,              。
    thenメソッドの戻り値
    then方法は常に新しいpromiseオブジェクトに戻り、thenメソッドを複数回呼び出し、デフォルトでは一つの空きpromiseオブジェクトに戻ります.
    var promise=readFile_promise('./foo.txt')
    promise.then(function(value){
      //success
      console.log('success', value) // foo
      return readFile_promise('./bar.txt')
    },function(error){
      //failure
      console.log('failure',error)
    }).then(function(value){
      console.log('then', value) // bar
    })
    プロモーションの実行
  • 私たちはthen方法でプロミスの結果を取得しますが、promiseはthen方法で呼び出された後に実行されますか?
  • var promise=new Promise((resolve, reject)=>{
      console.log('begin')
      resolve()
    })
    
    setTimeout(()=>{
      promise.then(()=>{
        console.log('end')
      })
    },5000)
    //   begin 5s end
    //      , promise               ,then         promise     , promise     。
    promiseでよく使うアプリ
  • レノベ
  • レジェクト
  • all
  • race方法は、プロミス配列をパラメータとして受信し、新たなプロミスを返します.配列中のプロミスは同時に実行を開始します.raceが返されるプロミスの状態は、行列の中で最初に実行されたプロミスの状態が決定されます.
  • catch実行エラーは、throwキーワードを使用してエラーを発生させ、catch方法を使用して
  • を捕捉することができる.
     //      promise    ,    promise.all()
    //       ,        promise       promise
    //              ,         promise  ,     resolve    。
    //         promise   reject,      promise    reject,         catch  
    var promises=['foo.txt','bar.txt','baz.txt']
    promises.map(function(path){
      // console.log(path)
      return readFile_promise(path)
    })
    
    Promise.all(promises).then(function(results){
      console.log(results) // [ 'foo.txt', 'bar.txt', 'baz.txt' ]      
    }).catch(function(err){
      // 
    })
    promise組織の非同期コードを使う
    //   ;              
    var lists=['foo.txt','bar.txt','baz.txt']
    var count=0;
    readFile_promise('foo.txt').then(readCB).then(readCB).then(readCB);
    
    function readCB(data){
      console.log(data) // foo bar baz
      if(++count>2){
        return
      }
      return readFile_promise(lists[count])
    }
    async/await
    awaitのキーワードの後ろにはプロミスが多いです.プロミゼーを暗黙的に呼び出しないとプロミゼーに変換します.awaitは後のpromiseの実行を待って次の操作を行います.
    var asyncReadFile=async function(){
      var result1=await readFile_promise('./foo.txt')
      console.log(result1.toString()) // foo
    }
    asyncReadFile()
    async戻り値
    async関数は常にプロミスオブジェクトに戻ります.もしreturnキーワードの後ろにプロミスがないなら、デフォルトでプロミスを呼び出します.resoliveメソッドを変換します.
    async function asyncFunc(){
      return 'hello Node'
    }
    asyncFunc().then(function(data){
      console.log(data) // hello Node
    })
    async関数の実行過程
  • は、async関数が実行を開始すると、プロミセオブジェクトを自動的に生成する.
  • メソッドが実行を開始した後、returnキーワードまたはthrowキーワードが発生した場合、実行は直ちに終了し、
  • awaitキーワードが発生したら、awaitの後の非同期動作を一時停止します.終了後に実行を再開します.
  • の実行が完了し、プロモーション
  • に戻ります.
    async function asyncFunc(){
      console.log('begin')
      return 'hello Node'
    }
    asyncFunc().then(function(data){
      console.log(data) // hello Node
      console.log('end')
    })
    // begin 
    // hello 
    // end
    await
    await操作子の結果はその後ろのpromiseオブジェクトの操作結果によって決定されます.もし後ろのpromiseオブジェクトがresovedになったら、await操作子が返した値はresoveの値です.プロジェクト対象の状態がrejectになれば、awaitもrejectの値を投げます.
    async function readFile(){
      var result=await readFile_promise('./foo.txt')
      console.log(result) // foo
    }
    readFile()
    
    //    
    readFile_promise('foo.txt').then(function(data){
      console.log(data) // foo
    })
    awaitは並行している
    awaitは、後のプロミセが完成するのを待って次の動作を行います.これは複数のawaitを操作すると、プログラムが完全なシリアル操作になります.
    非同期動作間に依存関係が存在しない場合、並列を実現するためにプロミセ.allを使用することができる.
    async function readFile(){
      const [result1, result2]=await Promise.all([
        readFile_promise('./foo.txt'),
        readFile_promise('./bar.txt')
      ])
      console.log(result1, result2) // foo bar
    }
    readFile()
    
    //    
    function readFile(){
      return Promise.all([
        readFile_promise('./foo.txt'),
        readFile_promise('./baz.txt')
      ]).then((result)=>{
        console.log(result) // [ 'foo', 'baz' ]
      })
    }
    readFile()
    awaitまとめ
    awaitキーワード使用のポイント
  • awaitキーワードはasync関数内部にある必要があります.
  • awaitキーワードの後ろにはpromiseオブジェクトが必要です.
  • awaitキーワードの返却結果は、その後ろのpromiseで実行された結果、おそらくreolvedまたはrejectの値
  • である.
  • は通常の矢印関数ではawaitキーワードを使用できません.矢印関数の前にasyncキーワードを追加する必要があります.
  • awaitはシリアルで非同期動作を実行するために使用されています.promise.all
  • を並列に使用したいです.
    async関数の欠点
  • は、多くの層の方法で呼び出され、最下層の非同期動作がasync方法にパッケージされていると仮定すると、この関数のすべての上位層の方法がasync方法になる可能性がある.