ES 6を深く理解する——Promiseと非同期プログラミング


ES 6を深く理解する——Promiseと非同期プログラミング
記事の目次
  • ES 6——Promiseと非同期プログラミング
  • を深く理解する.
  • 背景知識
  • Promise基礎知識
  • グローバルPromise拒否処理
  • 直列Promise
  • は、複数のPromise
  • に応答する.
  • Promiseから
  • を継承します.
  • Promiseの非同期タスクに基づいて
  • を実行する.
    背景知識
    JavaScriptはシングルスレッドです.
    同じ時刻にコードブロックを実行するだけです.
    イベントモデル
    Eventループはタスクキューのタスクを実行します.
    コールバックモード
    関数をパラメータとして非同期関数に渡し、非同期関数を実行し終わったら、タスクの列の最後に新しいタスクを追加します.タスクの変更には、コールバック関数と対応するパラメータが含まれます.
    逆転地獄に陥りやすい
    Promise基礎知識
    ライフサイクル
  • ペンディング実行中
  • fulfilled非同期動作成功(完了)
  • レジェクトの非同期動作に失敗しました.拒否されました.
  • すべてのPromiseにはthen方法があります.二つのパラメータを受信します.最初はPromiseの状態がfulfilledであるときに呼び出す関数です.二つ目はPromiseの状態がrejectであるときに呼び出す関数です.(拒否関数)
    let promise = readFile('example.txt')
    
    promise.then(function(contents) {
      //  
    })
    promise.then(function(contents) {
      //  
    }, function(err) {
      //  
    })
    promise.then(null, function(err){
      //   
    })
    
    Promiseはチェーン式で呼び出すことができます.Promiseが完了したら、新しいPromiseオブジェクトに戻ります.チェーン式で呼び出すことができます.
    処理済みのPromiseを作成します.
  • Promsie.resove()方法は一つのパラメータだけを受信して一つの完了状態のPromiseに戻ります.つまりタスクの編成過程はありません.そして、Promiseに複数の完了処理プログラムを追加して、値を得る必要があります.
    タスクのキューに新しいタスクを追加し、遅延を指定して実行します.タスク編成といいます.set Timeout、set Intervalのような関数
  • Promise.reject()と同じで、作成されたのは拒否されたPromise
  • であるという違いがあります.
    捕獲エラー
    let promise = new Promise(function(resolve, reject) {
      throw new Error('Expection')
    })
    promise.catch(function(err){
      console.log(err.message) // Expection
    })
    
    グローバルPromise拒否処理
    Promiseが論争している問題:処理手順を拒否していない場合、Promiseを拒否すれば、失敗を提示しない.
    Node.js環境の拒否処理
    直列Promise
    Promiseチェーンの戻り値は、returnで次のPromiseに戻ります.
    reolveのreturnは次のPromise.reolveに戻ります.
    rejectの中のreturnは次のPromise.rejectに戻ります.
    let p1 = new Promise(function(resolve, reject) {
      resolve(42)
    })
    
    p1.then(function(value) {
      console.log(value) // 42
      return value + 1
    }).then(function(value) {
      console.log(value) // 43
    })
    
    複数のPromiseに対応
    Promise.all()
    let p1 = new Promise((resolve, reject) => {
      resolve(1)
    })
    
    let p2 = new Promise((resolve, reject) => {
      resolve(2)
    })
    
    let p3 = new Promise((resolve, reject) => {
      resolve(3)
    })
    
    let p4 = Promise.all([p1, p2, p3])
    
    p4.then((value) => {
      console.log(Array.isArray(value)) // true
      console.log(value[0]) // 1
      console.log(value[1]) // 2
      console.log(value[3]) // 3
    })
    
    すべてのPromiseが実行に成功してから戻ってきたという意味で、Promiseが失敗したというPromiseデータが入ってきました.帰った結果もデータです.結果はパラメータの着信順に対応します.
    Promise.race()
    Promise.race()メソッドに伝えられたPromiseが選挙を行います.どのPromise状態が先に完成して、どの状態に戻りますか?
    Promiseから引き継ぐ
    class MyPromise extends Promise {
      //          
      
      success(resolve, reject) {
        return this.then(resolve, reject)
      }
      
      fail(reject) {
        return this.then.catch(reject)
      }
    }
    
    let promise = new MyPromise(function(resolve, reject) {
      resolve(42)
    })
    
    promise.then(function(value) {
      console.log(value) // 42
    }).catch(function(value) {
      console.log(value)
    })
    
    多くの第三者クラスがPromiseを継承することによって実現される.
    wx.request({
      method: 'GET',
      url: 'mp.wx.com',
      success(res) {
        
      },
      fail(err) {
        
      }
    })
    
    実は内部はPromiseを包装しました.
    Promiseによる非同期タスクの実行
    TODO:
    結び目
    ![image-20190619211946064](/Users/qingweicen/Library/Appliplication Support/typort-inger-mages/image-20190619211946064.png)