azu/promises-book を読んでいます(chapter3)

azuさんの「JavaScript Promiseの本」を読んでいます。 JavaScript Promiseの本

3. Chapter.3 - Promiseのテスト

テストの回です。

  • Mochaの選択理由
    • 著名なテストフレームワークであること
    • Node.jsとブラウザ どちらのテストもサポートしている
    • "Promiseのテスト"をサポートしている
Mochaは it の仮引数に done のように指定してあげると、
done() が呼ばれるまでテストの終了を待つことで
非同期のテストをサポートしています。
  • .then(done, done) とすることで、成功・失敗時ともに必ずdoneが呼ばれる
  • done() を呼ぶ代わりに、promiseオブジェクトをreturnすることもできる
  • onRejectedになることだけを期待して書かれたテストは、onFulfilledの状態になってしまうと 常にテストがパスしてしまうという問題がある -- 解決策としては、Fulfilled、Rejected 両方の状態について、テストがどうなってほしいかを明示

  • 通常のコードは then → catch と分けた方がよい

  • テストコードは then にまとめた方がよい
  • 忘れちゃうから、補助するヘルパー関数shouldFulfilled と shouldRejectedを利用したほうがいい

Rails Tutorial 第3版 第6章

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう の2周目です。
第6章 ユーザーのモデルを作成する | Rails チュートリアル

第6章 ユーザーのモデルを作成する

モデルの基本を押さえる回です。

メールアドレス正規表現

演習完了後のものです。@以降の連続ドットをNGとしています。

VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i

Rubular

ruby正規表現が試せるwebサービス
Rubular: a Ruby regular expression editor and tester

modelのself省略できないケース

左式ではselfを省略することはできません。

rails あるある。理由は、ローカル変数への代入になってしまうため。

has_secure_password

  • password_digest属性を追加する必要がある
  • bcryptをinstallする必要がある
  • 仮想的な属性(passwordとpassword_confirmation)が使える
  • authenticateが使える

modelのreload

DBからオブジェクトを再読み込みするので便利。

assert_equal mixed_case_email.downcase, @user.reload.email

azu/promises-book を読んでいます(chapter1-2)

以前から読みたかった、JavaScript Promiseの本 を読んでいます。
以下、個人的なメモですが、文章は 文章は CC-BY-NC ライセンスだそうですので
ライセンスを気にしてみます。

CC-BY-NC とは

クリエイティブ・コモンズ・ライセンスとは | クリエイティブ・コモンズ・ジャパン を見ると

原作者のクレジット(氏名、作品タイトルなど)を表示し、かつ非営利目的であることを主な条件に、
改変したり再配布したりすることができるCCライセンス。

だ、そうです。 ですので、作者はazuさんで、タイトルは「JavaScript Promiseの本」と述べておけば良いかな。

以下メモ

写経したりしながらですが、所要時間1時間ちょっと程度。
多少は知っていましたが、細かいところも含めて理解できてきました。
Promise.all 良いですね。

書籍の目的

以下が学べることしてあげられています。明確で良いです。

Promiseについて学び、パターンやテストを扱えるようになること
Promiseの向き不向きについて学び、何でもPromiseで解決するべきではないと知ること
ES6 Promisesを元に基本をよく学び、より発展した形を自分で形成できるようになること

1. Chapter.1 - Promiseとは何か

  • Promiseは非同期処理を抽象化したオブジェクトとそれを操作する仕組みのこと
  • Promise オブジェクトを生成して使う
  • promise.then() で onFulfilled, onRejected のコールバック関数を登録
  • onRejected は promise.catch でも実行可能
  • .catchは promise.then(undefined, onRejected) のエイリアス
  • 状態は Fulfilled, Rejected, Pending がある
  • 一度FulfilledやRejectedになると変化しない
  • PromiseはEvent等とは違い、.then で登録した関数が呼ばれるのは1回限り
  • reject に渡す値に制限はありませんが、一般的にErrorオブジェクト(またはErrorオブジェクトを継承したもの)を渡す

2. Chapter.2 - Promiseの書き方

  • Promise.resolve(value) new Promise() のショートカット
Promise.resolve(42);
// 以下と同等
new Promise(function(resolve){
  resolve(42);
});
  • Promise.resolve を簡単にまとめると、「渡した値でFulfilledされるpromiseオブジェクトを返すメソッド」
    Promise.resolve は共通の挙動である then だけを利用して、 さまざまなライブラリ間でのpromiseオブジェクトを相互に変換して使える
    (jQuery2のように.then というメソッドを持っていた場合でも、必ずES6 Promisesとして使えるとは限らない)
  • Promise.reject(error)は Promise.resolve(value) と同じ静的メソッドで new Promise() のショートカット
  • 同期と非同期処理の混在の問題が起きないようにするため、 Promiseは常に非同期 で処理される
  • taskA → task B という流れをPromiseのメソッドチェーンを使って書くことができます
  • promise chainでの値渡しはreturnで行う
  • Promise#catchは promise.then(undefined, onRejected); のエイリアス
  • IE8ではcatch使用時に工夫が必要
    IE8はECMAScript3であり、catchは予約後なので利用できない
    promise.catch を promise["catch"] に置換するか、thenを使う。
    (多くの圧縮ツールは上記置換を行う)
  • then, catch でそれぞれ新しいpromiseオブジェクトを作成している
  • Promise.all .then に渡される結果の配列は実行順だが、渡されたpromiseオブジェクトの配列を並列に実行している
  • Promise.all は、渡した全てのpromiseがFulFilled または Rejectedになるまで次の処理を待つ
  • Promise.race は、どれか一つでもpromiseがFulFilled または Rejectedになったら次の処理を実行
  • Promise.raceでは、 一番最初のpromiseオブジェクトがFulfilledとなっても、他のpromiseがキャンセルされるわけでは無い
  • .then の第二引数にはエラー処理を書くことができますが、 そのエラー処理は第一引数の onFulfilled で指定した関数内で起きたエラーをキャッチすることはできません
    .then のonRejectedが扱う処理は、その(またはそれ以前の)promiseオブジェクトに対してであって、 .then に書かれたonFulfilledは対象ではない