2017-01-22 10 views
-1

私が約束を連鎖していて、解決ハンドラから約束を返す場合、その約束はthenへの呼び出しの戻り値となるのでしょうか?舞台裏で何が起こっているのですか?次の例では「then」の戻り値にマップされた解決ハンドラから返されるプロミスはどうですか?

は、firstMethodHandlerで、secondMethodへの呼び出しは、それがその後返す新しい約束を受けたが、その約束は、それがその約束に渡されるthenメソッドから返されます。これはどうやって起こるのですか?

function firstMethod(value) { 
    console.log('1st method:', value) 
    return new Promise((resolve, reject) => { 
    resolve(++value); 
    }); 
} 

function secondMethod(value) { 
    return new Promise((resolve, reject) => { 
    console.log('2nd method:', value) 
    resolve(++value); 
    }); 
} 

function firstMethodHandler(value) { 
    console.log("1st method handler:",value); 
    return secondMethod(value); 
} 

function secondMethodHandler(value) { 
    console.log("2nd method handler:", value); 
} 


firstMethod(1) 
    .then(firstMethodHandler) 
    .then(secondMethodHandler) 
+3

「プロミスの仕様は何が起こるべきか」または「プロミスライブラリの実装の詳細」を超えて何を探しているのか分かりません。 – Quentin

+0

...または "他の戻り値が別の関数呼び出しの引数として渡されるのと同じ方法" – Quentin

+0

質問は何ですか?参照してください[間に違いがあります(関数参照)と.then(関数(値){戻りfunctionReference(値)}?)](http://stackoverflow.com/questions/41191131/are-there-differences-between -then関数の参照と関数の値) – guest271314

答えて

1

ここで重要なのは、p1.then()は、我々はp2を呼び出す新しい約束を返すことです。 p1が解決されると、.then()ハンドラが呼び出されます。その.then()(これをp3と呼ぶ)から別の約束を返すと、p3p2に連鎖します。したがって、p3の解決まではp2は解決されません。したがって元のp1.then()の呼び出し元はp2となり、p1p3の両方が解決されるまで解決されません。それは物事が一緒に連鎖する方法です。

通常、ここでの重要な情報は、p1.then()が新しい約束を返し、以前の.then()ハンドラの内部で何が起こるかによって影響を受けるという約束です。あなたの具体的な例では

Difference between resolve and return in promise JS


:あなたはここに同様の説明を見ることができます

firstMethod(1) 
    .then(firstMethodHandler) 
    .then(secondMethodHandler) 

firstMethod()は、私がp1を呼ぶ約束を返します。その後、その約束の上に.then(firstMethodHandler)を呼び出すと、新しい約束p2が返され、次に約束するp3を作成すると.then(secondMethodHandler)を呼び出します。

将来、ある時点で、firstMethod()は返された約束を解決します。したがって、今すぐp1が解決されました。これにより、.then()ハンドラが接続され、firstMethodHandler()が呼び出されます。それは新しい約束p4を返します。チェーンp4p2となるので、p2p4まで解決しません。将来的にはp4が解決され、p2が解決されます。それはp2に接続された.then()ハンドラを呼び出すため、secondMethodHandler()が呼び出され、最終的にconsole.log()が表示されます。

説明からわかるように、.then()が最初に実行されたときに作成される新しい約束p2p3がここにあります。これは、連結された.then()ハンドラが実際にリンクされているものであり、それらの約束は、付属の.then()ハンドラから返されるものの影響を受けるものです。

チェーンがやっているかを見るために、私たちは実際のチェーンを削除し、あなたに自動的に作成され、使用されている実際の中間変数を表示することができます。

var p1 = firstMethod(1); 
var p2 = p1.then(firstMethodHandler); 
var p3 = p2.then(secondMethodHandler); 

p1firstMethod() p2の内部に解決されるリターンですp1.then(...) p3の値は、それがR、(p1が解決した後に)firstMethodHandlerが呼び出されp2.then(...)

の戻り値でありますに接続されているp4のように、p2が解決されるまでp4が解決されない。 p4が最終的に解決するとp2が解決され、secondMethodHandlerが呼び出されます。その.then()ハンドラが通常の値を返すと、p3が解決され、チェーン全体が完了します。

+0

あなたは 'それから別の約束を返せば(それは)'と言いますが、これはまさに私の質問です。私は当時から約束を返さない。私はそれを渡した関数/ハンドラから返します()。この約束はどのようにして最終的に返されるのですか?私はその仕組みに興味があります。 – Undistraction

+1

@Pedr - '.then()'を呼び出すたびに新しい約束が返されます。 '.then()'の戻り値は新しい約束です。それはあなたがすることではありません。それが ''() ''の仕組みです。チェーン上の '.then()'へのすべての呼び出しが直ちに実行され、それらの約束が直ちに作成されることを思い出してください。 '.then()'に渡されたコールバックは内部でイベントハンドラとして登録され、後で呼び出すことができます。私の答えの最後の4つの段落をお読みください。それは自動的にあなたのために作成されるすべての中間約束を示しています。 – jfriend00

+0

ありがとうございます。私はペニーがちょうど落ちたと思う。私がコールバックから返ってきた約束は、 'then()'の呼び出しから返された約束と同じであることを理解しましたが、 'then()'がすでに返ってきたので不可能です。私はあなたの答えを選択し、うまくいけば私の頭をベッドに置くよ。 – Undistraction

関連する問題