from electron 2 web

インターネットのリソースを無駄遣いして検索におけるUXを下げてごめんなさい

圧倒的文章力のNASAでゴミみたいなチラ裏のようなメモを量産してしまい全ての"Web開発者"にごめんなさい

ES6とあの夏の約束

promiseについて

ある程度は知ってるけどServiceWorkerの翻訳してたら必要になったのでブラッシュアップと100%理解する。

こうした非同期処理の煩雑さを解決するために実に数多くの手段が考えだされてきましたが、その手段は大きくわけて2つあると思います。

  • ネストが深くならないように、コールバックの構造を変形する(jQuery.Deferred, async.js など)
  • スレッド/ファイバー/コルーチンで処理の流れを複数つくり、同期処理する(generators, fibers, Web Workers など)

promiseは3つの状態を持つ

  • 未完了
  • 成功
  • 失敗

英語では

  • pending
  • fulfilling
  • rejecting

という謎の英単語を使う。

コールバック関数と比べると何が違うのかを簡単に見ると、 非同期処理の書き方がpromiseオブジェクトのインターフェースに沿った書き方に限定されます。

azu.github.io

azuさんのPromise本。とてもわかり易い。神。

Promiseインスタンスのfunctionに非同期処理を書く。
まだ成功時の処理とかは書かない。
then,catchのfunctionで成功時、失敗時の処理を書く

ES6 Promisesの仕様 では PromiseStatus という内部定義によって状態が定められています。

promiseオブジェクトの状態は、一度PendingからFulfilledやRejectedになると、 そのpromiseオブジェクトの状態はそれ以降変化することはなくなります。

つまり、PromiseはEvent等とは違い、.then で登録した関数が呼ばれるのは1回限りという事が明確になっています。

promise.resolveはそのPromiseオブジェクトのテストしたい時とかに便利。

ES6 PromisesにはThenableという概念があり、簡単にいえばpromiseっぽいオブジェクトの事を言います。

.length を持っているが配列ではないものをArray likeというのと同じで、 thenableの場合は .then というメソッドを持ってるオブジェクトを言います。

var promise = Promise.resolve($.ajax('/json/comment.json'));// => promiseオブジェクト promise.then(function(value){ console.log(value); });

promise内の非同期処理はnewした時点で呼ばれる 内部でコントラクタが関数を呼んでる

「2.3.1. 同期と非同期の混在の問題」(Promise本)をよんでいたら非同期がよくわからなくなってきたので同期の定義を確認しよう。

同期とは・・・処理A、Bがあり、AがBを呼ぶとする。A処理中に他のことができずフリーズするのが同期
alertとかね。

多くの人はこいつがデバックにつかわれる理由にデータを画面に表示するからだと思っているけど、他の何も出来ない(プログラムが進まない)という側面もある。

ES5以降では予約語をプロパティ名に使用することが出来る。 また、ブラケット記法ならES3でも予約後をプロパティ名に使用できる。

promise.allは配列の中身を同時に実行する。
Promise.all は、渡した全てのpromiseがFulFilled または Rejectedになるまで次の処理を待つ↓

つまり全ての処理の状態が遷移するまでイベントはdispatchされない

モカ以降は読んでないけどとても良書でした→promise本