私は最終的にjavascript/ES6 Promisesの周りで私の心を曲げることができたと思います。それは簡単ではなかった!しかし、デザインについて私を困惑させる何かがあります。javascript Promise APIは、必要以上に畳み込まれていますか?
なぜPromiseコンストラクタがコールバックを取るのですか?コールバックがすぐに呼び出されると、呼び出し元はそのコードを実行するだけで、「私に電話しないで、私はあなたに電話します」という心配の1つの不必要なレベルを回避できますか?
ここでは、Jake ArchibaldのJavascript Promisesチュートリアルhttp://www.html5rocks.com/en/tutorials/es6/promises/#toc-promisifying-xmlhttprequestからコピーされたPromiseの使用例のプロトタイプの例を、コメントを削除して考えています。
それはXMLHttpRequestをGETリクエストのための約束ベースのラッパーです:私にとって
function get(url) {
return new Promise(function(resolve, reject) {
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function() {
if (req.status == 200) {
resolve(req.response);
}
else {
reject(Error(req.statusText));
}
};
req.onerror = function() {
reject(Error("Network Error"));
};
req.send();
});
}
、上記のコードは、約束の非常にわずかに異なる種類を使用して、次のようにそれが書き直された場合に理解することが非常に容易になるだろう私は、想像引数なしのコンストラクタを持つと解決/メソッドを拒否してること:
function get(url) {
var promise = new MyEasierToUnderstandPromise();
var req = new XMLHttpRequest();
req.open('GET', url);
req.onload = function() {
if (req.status == 200) {
promise.resolve(req.response);
}
else {
promise.reject(Error(req.statusText));
}
};
req.onerror = function() {
promise.reject(Error("Network Error"));
};
req.send();
return promise;
}
MyEasierToUnderstandPromiseプロミスの面で実装するにはあまりにも難しいことではありません。最初はプロミスの実際のサブクラスにしようとしましたが、何らかの理由でそれを動作させることができませんでした。その代わりに、私はメンバ関数のように振る舞う添付余分な機能 のカップルと、昔ながらのPromiseオブジェクトを返す単純なファクトリ関数、としてそれを実装:
だから、function NewMyEasierToUnderstandPromise() {
var resolveVar;
var rejectVar;
var promise = new Promise(function(resolveParam, rejectParam) {
resolveVar = resolveParam;
rejectVar = rejectParam;
});
promise.resolve = resolveVar;
promise.reject = rejectVar;
return promise;
};
、なぜこのように設計された約束されていませんか?それがあれば、約束をもっと早く理解できるようになりました。私の学習時間を半減させたと思います。
私は多くのスマートな人がプロミスAPIの作成に手を携えていたことを知っています。誰もが一般的に幸せで誇りに思えるので、彼らは何を考えているのだろうかと思います。
あなたの「easierToUnderstandPromiseは」の方法でjQuery.Deferredのようなものです。あなたの設計では、返された約束は必ず解決/拒否の方法を公開します。私はなぜこれが「悪い」ものなのか読んだことがありますが、そのリソースを見つけることができませんでした。(それを読んでから何年も経ちました) –
[ES7 async/await](https://jakearchibald.com/2014)/es7-async-functions /)を実行します。 –
遅延パターンもありますが、正当な理由で廃止されました。(http://stackoverflow.com/q/28687566/1048572) – Bergi