2016-12-21 6 views
0

Node.jsコードスタイルをコールバックから、トレンドのように見えるpromiseに変換することを学び、新しいコンセプトに多くの利点があります。 重要な点がなく、約束を守るために、私は document on MDNと読んでいます。私は、このページにを理解するが、ほとんど最初からは言及していたものノートクリアできませんでした:MDNドキュメントのPromise.prototype.then()のノートを理解できませんでした

注:最初の引数が省略されるか非機能が提供されている場合...を、 作成された新しいPromiseは、(実行された場合)というPromissionの履行状態を単に採用します。 第2引数が省略されているか、または機能が提供されていない場合、 が作成された新しいプロミスは、 (拒否された場合)と呼ばれるプロミスの拒否状態を採用します。

これは簡単なことです。 例を挙げて説明したいと思います。非常に感謝しています。

+0

@Joeクレイ、torazaburo @、本当に、ちょうど私が尋ねたことについて、私はより明確にし、同じことを説明する2つの方法をご回答の両方を感謝しています。どちらの側面は、すべての詳細と私には素晴らしいです、それは私がちょうど背後にある多くのメカニズムを議論torazaburo年代を受け入れることを申し訳ありませんが、受け入れることを決めたことは困難です。しかし、ジョーも貴重です、皆さん、もう一度ありがとうございます。 – Carr

+0

問題はありません、私はtorazaburoの説明が明確だったと思います:)とにかく、ある程度助けてくれるのはうれしいです! –

答えて

2

他の回答には良い説明を提供しますが、をスキップの概念を用いてこれを表現する方が簡単かもしれません。

場合と約束を満たす場合、次いでthen引数は(限り、それは関数のように)呼び出されます。 ifと約束を拒否したときに、その後、thenの引数は、(それがある機能である限り)呼び出されます。それ以外の場合、.thenはスキップされます。

純粋主義者は.thenは「スキップ」であり、実際に何が起こっていること.thenと等価である(またはの状態を想定して)新しい約束を作成することであると言うことは間違っているオブジェクトです元約束する。それは技術的には正しかったが、非公式に話して、.thenが「スキップされた」と考えるのは簡単です。

例:

た場合との約束が拒否したときに、その後、catchの引数は、それがあるとして(呼び出された:完全性については

function log(v) { console.log("value", v); } 
function err(e) { console.log("error", e); } 

Promise.resolve(1).then(null, err).then(log); 
        ^^^^^^^^^^^^^^^ "SKIPPED" (onFulfilled is null) 

Promise.reject(1).then(log).catch(err); 
        ^^^^^^^^^  "SKIPPED" (onRejected is not given) 

catchのための対応動作です関数)。それ以外の場合は、.catchはスキップされます。あなたは慎重に考えてみれば

Promise.resolve(1).catch(err).then(log); 
        ^^^^^^^^^^  "SKIPPED" (promise did not reject) 

、あなたは、このすべてが.then(null, handler).catch(handler)にあらゆる方法で正確に同等であることを意味していることがわかります。だからcatchは、利便性のルーチンの一種と考えることができます。

でもできるが、その後、非機能ハンドラを無視してのポイントは何ですか?代わりにTypeErrorなどを投げてはいけませんか?実は、これは以下のように使用することができ、「機能」である:それは水曜日の場合は

promise.then(isWednesday && wednesdayHandler) 

、これはwednesdayHandlerと評価されますし、我々はいくつかの特別な水曜日の処理を行うことができます。また、それは水曜日ではありません、これは明らかに機能していない、falseに評価されますので、全体then句は、「スキップ」されます。

+0

これはそれを説明する良い方法です、素敵な仕事:) –

+1

どのように非機能ハンドラを処理する方法は本当に私を驚かすことができます!他の多くの情報を調査したときに私はこれについて学んでいなかった。たくさんありがとう! – Carr

3

EDIT:より良い仕様に合わせて更新からherehereを参照してください。

.then方法は、それが添付の約束かどうかに依存してを満たしたり拒否あり、2つの関数のいずれかを呼び出します。次に、その呼び出しの結果に基づいて新しいPromiseを返します。これにより、プロミスが成功したかどうかによって異なるロジックを実行することができ、プロミスを簡単に連鎖させることができます。

しかし、これらの関数のいずれかを渡すことにしないと、あなたが投稿したメモが示唆しているものである賢明なデフォルトが使用されます。しかし、説明するよりもデモンストレーションする方がはるかに簡単です!あなたがonFulfilledを省略した場合

myPromise.then(function (value) { 
    console.log("success!"); 
}, function (reason) { 
    throw reason; 
}); 

:あなたは、onRejectedコールバックを残しそうのような場合は


myPromise.then(function (value) { 
    console.log("success!"); 
}); 

結果は、これを行うと同じですコールバック、そう:

あなたは両方を省略した場合

myPromise.then(function (value) { 
    return value; // the same as returning Promise.resolve(value) 
}, function (reason) { 
    console.log("fail!"); 
}); 

...:

myPromise.then(null, function (reason) { 
    console.log("fail!"); 
}); 

結果は同じですそれはまだ基本的に無意味ですが、:

myPromise.then(); 

これが効果的に同じものである:

今度は、基本的にはされて
myPromise.then(function (value) { 
    return value; 
}, function (reason) { 
    throw reason; 
}); 

myPromise 
+0

@torazaburo:訂正のおかげで、正しい用語を使用するように私の答えを更新しました!私はあなたの最後のコメントについて100%確信しているわけではない - 'onFulfilled'コールバックを残しておくことは間違いなく期待通りに(ちょうど私のコンソールでそれをテストして)動作し、[spec](http://www.ecma-international.org /ecma-262/6.0/#sec-performpromisethen)は、呼び出し可能な値でない場合にどのような振る舞いが起こるべきかを述べる途中にあります。これはそういう形で使うのは良い考えだとは言えません! –

関連する問題