Promise/A+仕様

4592 ワード

Promiseは非同期操作の最終結果を表します.Promiseとの最も主要なインタラクション方法は、関数をそのthen方法に導入することによってPromiseの最終的な値またはPromiseが最終的に拒否される原因を得ることである.
1.用語promiseはpromise仕様then方法に対応するオブジェクトまたは関数であり、thenableは、then方法を含むオブジェクトまたは関数である.valueは任意のJavascript値である.(undefined、thenable、promiseなどを含む)exceptionthrow表現によって投げられた値です.reasonは、Promiseが拒否された理由を説明するための値である.
2.要求
2.1 Promise状態
一つのPromiseはその中の一つの状態におかなければなりません.
  • もしペンディング状態であれば、promise:
  • は、fulfilledまたはreject状態に変換することができる.
  • ful filled状態であれば、promise:
  • は他の状態に変換できません.
  • には値が必要であり、この値は変更されない.
  • レジェクト状態であれば、promiseは可能です.
  • は他の状態に変換できません.
  • は一つの理由が必要であり、この値は変更されない.
  • 「値を変えることはできない」というのは、そのidentityがメンバーの内容を変えられないということではなく、変更されないということです.
    2.2 then方法
    Promiseは、その値または理由を得るためにthen方法を提供しなければならない.Promiseのthen方法は二つのパラメータを受け入れる.
    jspromise.then(onFulfilled, onRejected)
    
  • onFulfilledおよびonRejectedはいずれもオプションパラメータである.
  • は、onFulfilledが関数ではない場合、無視される.
  • は、onRejectedが関数ではない場合、無視される.
  • は、onFulfilledが関数である場合:
  • は、promise fulfilledの後に呼び出されなければならず、promiseのvalueは、その最初のパラメータである.
  • それはpromise fulfilledの前に呼び出すことができません.
  • は複数回起動されません.
  • は、onRejectedが関数である場合、
  • は、promise rejectの後に呼び出さなければならず、promiseのreasonはその最初のパラメータである.
  • それはpromise rejectの前に呼び出すことができません.
  • は複数回起動されません.
  • onFulfilledおよびonRejectedは、execution contextスタックにプラットフォームコードのみが含まれている場合のみ実行を許可する.
  • onFulfilledおよびonRejectedは、関数として呼び出されなければならない(i.e.すなわち、関数体内のthisundefinedである).
  • は、1つのpromiseに対して、そのthen方法は、複数の回数を呼び出すことができる.
  • は、promise fulfilledの後、onFulfilledのすべてがその登録順に実行されなければならない.
  • の場合、promise rejectの後、すべてのOnRejectedはその登録順に実行しなければならない.
  • thenはpromise[3.3].
    jspromise2 = promise1.then(onFulfilled, onRejected);
    
    を返さなければならない.
  • もしonFulfilledまたはonRejectedが値xに戻ったら、Promise解析フロー[[Resolve]](promise2, x).
  • が実行される.
  • が、onFulfilledまたはonRejectedが異常eを投げ出した場合、promise2ereasonとして拒否されるべきである.
  • onFulfilledが関数ではなく、promise1が既にfulfilledしている場合、promise2promise1の値fulfilledでなければならない.
  • もしOnRejectが関数ではなく、promise1がすでにrejectiedしているなら、promise2は同じreasonで拒否されなければならない.
  • 2.3 Promise解析過程
    Promise解析プロセスは、1つのpromiseと1つの値をパラメータとする抽象的なプロセスであり、[[Resolve]](promise, x)として表されることができる.
  • は、promiseおよびxが同じ値を指す場合、TypeErrorを使用して、理由としてpromiseを拒否する.
  • もしxpromiseであれば、その状態を採用する.
  • もしxがpending状態であれば、promiseは、pendingをx fulfilledまたはrejectiedまで歩かなければならない.
  • もしxがfulfilled状態であれば、xの値をfulfill promiseに用いる.
  • もしxがreject状態であれば、xの原因をreject promiseに使用する.
  • は、xがオブジェクトまたは関数である場合:
  • thenx.then.[3.5]
  • に賦課する.
  • x.then値を取ったときに異常が発生した場合、この異常を理由にpromiseは拒否される.
  • は、thenが関数である場合、xthisの関数としてthenを呼び出し、第1のパラメータはresolvePromiseであり、第2のパラメータはrejectPromiseである.
  • は、resolvePromiseyでパラメータとして起動されると、[[Resolve]](promise, y).
  • を実行する.
  • は、rejectPromiseをパラメータとして起動すると、rを理由にrを拒否する.
  • もしpromiseおよびresolvePromiseが呼び出された場合、または何度も呼び出された場合、最初だけ有効で、後は無視されます.
  • rejectPromiseを呼び出したときに異常が発生した場合、
  • thenまたはresolvePromiseが呼び出された場合は無視する.
  • でなければ、rejectPromiseでreasonのためにeを拒否します.
  • は、promiseが関数ではない場合、thenを値fulfill xとする.
  • は、promiseがオブジェクトでも関数でもない場合、xを値fulfill xとする.
  • 追加
    英語の原文の住所:http://promisesaplus.com 本文の各規則を理解するには、そのテスト倉庫を参照してください.https://github.com/promises-aplus/promises-tests/tree/master/lib/tests