2017-01-06 7 views
3

私は、ホビープロジェクトでそれらを使用することでより良い約束を理解しようとしていますが、なぜ最後のものではなく約束のチェーンの最初の.thenから価値が得られるのか分かりません。言い換えれば、私は約束で何らかのコードを実行し、最後にその約束の外に価値を返すのでしょうか?ありがとう!私は値 'x'を期待するが、プログラムは 'b'を返す。なぜこの約束は最後のものではなくチェーンの最初のアイテムで解決されますか?

var Promise = require('bluebird') 

Promise.resolve('x') 
    .then(function (user) { 
    return Promise.resolve('c').then(function (roll) { 
     return Promise.resolve('a').then(function (user) { 
     return Promise.resolve('b') 
     }) 
     .then(Promise.resolve('x')) 
    }) 
    }) 
    .then(function (output) { 
    console.log(output) 
    }) 
+0

それはあなたが言っていないではない、少なくともので、求めているものは不明だどのような値あなたに」あなたは何を期待していますか?しかし、上記はプロミスの創造的な反パターンの大きな例であることに注意してください。それらの「プロミス。解決」のすべてではないにせよ、ほとんどが必要ではありません。 'then'は約束を作成し、' then'コールバックから値を返します。 –

+0

申し訳ありませんが、私はそれを編集しますが、印刷するときにxを期待しています。 – meyer9

+0

また、コールバックから値を返すことはどういう意味ですか?すべての 'then'コールバックからプロミスを返すことが示唆されたと思いました。 – meyer9

答えて

3

私は約束は一度しか解決できないと信じています。残りは無視されます。分解された値の更なる突然変異は、thenを連鎖することによって達成される。あなたは(xの出力)を探している結果を達成するために、あなたのコードは次のようになります。

var Promise = require('bluebird') 

Promise.resolve('x') 
    .then(function (doesnotmatter) { 
    return Promise.resolve('c').then(function (alsodoesnotmatter) { 
     return Promise.resolve('a').then(function (noneofthismatters) { 
     return Promise.resolve('b') 
     }) 
     .then(function(){return 'x'}) 
    }) 
    }) 
    .then(function (output) { 
    console.log(output) // 'x' 
    }) 

例をより明確にするために:

var Promise = require('bluebird') 

Promise.resolve('y') 
    .then(function (y) { 
    // y == 'y' 
    return 'c'; 
    }) 
    .then(function(c) { 
    // c == 'c' 
    return 'a'; 
    }) 
    .then(function(a) { 
    // a == 'a' 
    return 'b'; 
    }) 
    .then(function(b) { 
    // b == 'b' 
    return 'x'; 
    }). 
    then(function(x) { 
    console.log(x); // output is 'x'; 
    }); 
+0

たとえば、最初の例のPromise.resolve( 'b')は、ファイルの読み込みなどの別の約束で置き換えることができ、そのコードはまだxを返すでしょうか? – meyer9

+0

正しい。私たちは約束の最終価値のみを記録しており、その値は 'return 'x"行によって設定されています。 – threeve

+0

申し訳ありません。それはずっと意味があります – meyer9

4

約束チェーンのポイントを、それができることですthenコールバックを使用して結果を変換します。これが表示されます。 結果を変換したくない場合は、thenコールバックを伝播する値を返すか、thenで返されたものを使用せずに元の約束をそのまま使用する必要があります。

thenが作成するあなたはthenコールバックから戻った内容に基づいて解決された約束を、忘れないでください。したがって、それらのすべてではないにしてもほとんどの場合、必要はありませんPromise.resolve呼び出します。

簡単な例のカップルは(ブラウザでPromiseサポートが必要です):

// Prints: 
 
// First callback got a 
 
// Second callback got A 
 
Promise.resolve("a") 
 
    .then(function(value) { 
 
    console.log("First callback got " + value); 
 
    return value.toUpperCase(); 
 
    }) 
 
    .then(function(value) { 
 
    console.log("Second callback got " + value); 
 
    return value.toUpperCase(); 
 
    }); 
 

 
// Contrast that with using the same promise for both `then` calls: 
 
// Prints: 
 
// Third callback got a 
 
// Fourth callback got a 
 
setTimeout(function() { 
 
    var p = Promise.resolve("a"); 
 
    p.then(function(value) { 
 
    console.log("Third callback got " + value); 
 
    return value.toUpperCase(); 
 
    }); 
 
    p.then(function(value) { 
 
    console.log("Fourth callback got " + value); 
 
    return value.toUpperCase(); 
 
    }); 
 
}, 100);

関連する問題