2017-01-15 19 views
1

以下の私のコードによれば、最終的にすべてのデータを連鎖していますが、最終的な関数では召喚者にアクセスできない.catchを使ってデータを表示したいと思っています。あなたのコードでプロミスチェーン経由で結果を渡すことはできませんか?

getSummonerData(req.params.playerName) 
.then(function(summoner) { 
    return getMatchIds(summoner[0].id); 
}) 
.then(function(matchIds) { 
    return getGameData(matchIds); 
}) 
.then(function(gameData) { 
    res.render('profile', {player:summoner, games:gameData}); 
}) 
.catch(function(e) { 
    console.log(e); 
}); 
+0

すべての約束関数で約束を返すことを確認するだけです – Elevant

+0

より正確には、連鎖しているときに、解決された値として正しいデータ形状を渡す必要があります。召喚者はgameDataの小道具である必要がありますあなたの場合。 – Xlee

+0

@Xlee:「データシェイプ」とはどういう意味ですか? 'then'コールバックから必要なものを返すことができます。 '.then(function(){return 42;})'はうまくいきます。もしあなたが返すものが可能であれば、その時の約束は、その返済可能性に従属します。あなたが返すものが返品不可能な場合、約束された 'then'返品はあなたが返却した値で自動的に解決されます。 .then(function(){Promise.resolve(x);}) '(あなたの今削除された提案)は' .then(function(){return x;}) 'と書くのにちょうど長い方法です。 –

答えて

1

は、summonerはない別の場所で、getMatchIdsにお電話を含むthenコールバックにのみアクセス可能です。後でアクセスできるようにするには、ゲームデータとともにthenコールバックから返すか、またはthenコールバックをネストしてのコールバック内にコールバックする必要があります。

後者はおそらく1簡単です:

getSummonerData(req.params.playerName) 
.then(function(summoner) { 
    return getMatchIds(summoner[0].id) 
    .then(function(matchIds) { 
     return getGameData(matchIds); 
    }) 
    .then(function(gameData) { 
     res.render('profile', {player:summoner, games:gameData}); 
    }); 
}) 
.catch(function(e) { 
    console.log(e); 
}); 
+0

は私のレンダリングにgamedataも渡すことを確認するだけですか?乾杯すると意味があります – Elevant

+0

@有能:はい、その部分は影響を受けません。これらのハンドラを 'getSummonerData'のハンドラに移動することで' summoner'を閉じることができますが、 'getGameData'から得られるものは影響を受けません。 –

+0

おかげで、私はまだjavascriptのコールバックがアクセススコープなどの機能を果たしていることを学んでいます。 – Elevant

0

私はあなたが「約束機能」によって何を意味するかわかりません。私はあなたが 'それから'と 'キャッチ'がいつも約束を返すことを知らないと推測しています。そのため、あなたはそれらを連鎖させることができます。それぞれの「then」または「catch」は、前任者によって返された約束の方法です。それらの連鎖した約束は、後に彼らの先人に何が起こるかによって決まるか、または拒否されます。

あなたの最後の関数 'res.render(...)'はあなたが見たい値を返します。次に、promise 'then(render(...))'は 'res.render(...)'から受け取った値で解決されます。

これは「キャッチ」と一緒に働くことです:あなたが見たいと思っている価値を持つ約束を解決しました。しかし、「キャッチ」はその機能を「拒否された」約束でしか発動させない。代わりに「then」が必要です。

関連する問題