Promise&Generator――幸せに同期方法で異歩JavaScriptを書く


最近は自分のサイトを書いていますが、無意識のうちに5コール関数が組み込まれた怖いコードをcallbackで書きました.気がつくと自分にびっくりさせました.これはいけません.醜くて見られません.そこで、流行の非同期の解決策を試してみるつもりです.さんざん苦労して、やっと自分が満足できるプランを見つけました.でも、正式に紹介する前に他の関連知識を紹介しましょう.
1.JavaScript非同期解決案はどれがありますか?
実は、非同期JavaScriptはもう高級なものではありません.Nodejsの出現、特にcallback hellの恐ろしい書き方は成功しました.ここで尤雨渓大神のこの小さい短文を見て、非常に簡潔に現在よく使われているasync.jsPromisecoasync/awaitasync.jsを紹介しました.個人的には機会があれば全部試してみてもいいです.個人的には以下の基準で選ぶかもしれません.
  • は爬虫類を書いて合併数を制御したいです.APIを使います.それはいくつかのPromiseがあります.やはり便利です.
  • は、フロントエンドのコードを書くときは、ajaxを考慮する傾向があります.フロントエンドの非同期シーンは、一般的にはisomorphic-fetch以外にも多くないようです.しかも前にnodejsを使ったことがあります.とてもいい感じです.前の文章が読めます.
  • .
  • バックエンドコードcoは、es7以外のものではない.尤雨渓大神によると、async/awaitPromise & Generatorもただのcoの文法飴です.Promiseは、Generatorcoとを結合した神のような倉庫である.本論文は主にPromiseGeneratorES6とを結合する非同期の解決方法である.
  • 2.Promise&Generator簡単入門Promiseはいいものです.そのうちのGeneratorPromiseは精華の一部と言えます.簡単に入門を紹介します.Generator及びES6です.このセクションの紹介は簡単で、しかもこの二つの新しい特性の一部にすぎません.もちろん、学習の角度から、本を探して完全にこの2つの特性を理解するべきです.少なくとも印象があります.NCZの学習はPromiseのUnderstanding ECMAScript 6または阮一峰大神のES 6標準入門を読むことができます.電子書籍があります.素晴らしいです.前者の言葉は分かりやすくて、面白いです.後者はもっと詳しくて、筋道があります.これらの特性についてよく知っているなら、このような細かい点は見なくてもいいです.
    2.1 PromiseES6には多くのバージョンがあり、多くの実装ライブラリがありますが、ここでは主にpromise規格の内容を紹介します.以下のいくつかの特性を読んで分からないと思ったら、先に上の二つの本の該当する章を見てください.
  • Promiseに関して、まず対象であることを意識します.このようなオブジェクトはNodejsのコンストラクタで作成することができ、promise自体のいくつかのデフォルトの戻りによってもこのようなオブジェクトを取得することができる.
  • Pendingオブジェクトは、3つの状態があります.FulfilledRejectedresolve.それぞれ未スタートの状態、成功の状態、失敗の状態に対応しています.
  • このようなオブジェクトはしばしば非同期の方法をカプセル化している.非同期方法では、いつ成功するかをrejectthenによって規定し、いつが間違っているかを判定しながら、パラメータをこの2つの関数に渡す.これらのパラメータは非同期で得られた結果またはエラーです.
  • 非同期が成功した時もあれば、間違いがあった時もあります.オブジェクトは、非同期終了後の動作(正確な処理関数/エラー処理関数)をcatchおよびthenの方法で規定する.catchおよびPromise.prototypepromise上の関数であり、したがって、「実装」の後(実際には本当の例ではない)はそのまま使用できる.
  • このthenオブジェクトにはもう一つの不思議なところがあります.promiseの各々はGeneratorオブジェクトを返し、上記のように非同期が待って、所定の正しい処理関数かエラー処理関数かを選択する.
  • 2.2 Generatoryield関数は、星付き関数であり、一時停止可能な関数である.
  • 関数の内部はyieldを介して関数を推進する.valueの後の値を定義することによって、戻りのnextが決定される.
  • 関数は、エルゴードを返します.このエルゴードはyield方法でオブジェクトを取得できます.このオブジェクトはCoによって定義されたパラメータを含んでいます.
  • ES 6の知識の他の特性については触れませんが、同じ(yi)ステップコードを書くなら、これらを身につけるだけで十分です.
    3.Co
    とんとんと音がします不思議なtjが登場しました.これはGithub大神が書いたライブラリです.使い方は簡単です.Co上のREADMEもはっきり言いました.主に2点です.
  • generator関数にはgenerator関数が含まれています.yield promise関数にはCoオブジェクトが含まれています.nextの内部実装では、promise関数を再帰的に呼び出して、各Coの値を返して、非同期の表記を実現する.
  • promise関数は、thenオブジェクトに戻り、catchGenerator方法を呼び出して、Node関数が返された結果を伝達することができる.後続の成功処理やエラー処理が容易です.
  • 4.同期の書き方で、同期のコードを書く方法
    ここには非同期処理のコードが展示されています.同期の書き方は本当にさわやかです.
    function *foo(res, name, newPassword, oldPassword) {
      try {
        // yield  promise  ,           catch   ,      user。
        const user = yield new Promise(function(resolve, reject) {
          //           
          User.get(name, function(err, user) {
            if(err) reject(err)
            resolve(user)
          })
        })
    
        if(user.password != oldPassword) {
          return res.send({errorMsg:"      !"})
        }
    
        //                         “  ” ,       ,   ~      debug~
        yield new Promise(function(resolve, reject) {
          User.update(name, newPassword, function(err) {
            if(err) reject(err)
            res.send({msg: "        !"})
            resolve()
          })
        })
    
      } catch(e) {
        console.log("Error:", e)
        return res.send({errorMsg:"Setting Fail!"})
      }
    }
    
    //          co     Generator    。
    co(foo(res, name, newPassword, oldPassword))
    5.まとめ
    シーンを使う方法が一番いいです.でも、Coと書いているうちに地獄に帰るという悩みがありましたら、試してみてもいいですか?同期書きで異歩を書く感覚は本当に素晴らしいです.
    文の中に何か間違いや不適切なところがあれば、指摘してください.ありがとうございます.お互いに勉強してこそ上達できるのですね.