2017-01-15 6 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

Чтобы быть более точным, по мере того, как вы цепляетесь, вам нужно передать правильную форму данных в качестве разрешенного значения, summoner должен быть опорой gameData в ваш случай. – Xlee

+0

@ Xlee: Что вы подразумеваете под «формой данных»? Вы можете вернуть все, что хотите, из обратного вызова 'then'; '.then (function() {return 42;})' просто отлично. Если то, что вы вернете, тогда возможно, что обещание 'then' возвращается к подчиненному. Если то, что вы возвращаете, не подлежит замене, обещание 'then' возвращает автоматически разрешаемое значение, которое вы вернули. '.then (function() {return Promise.resolve (x);})' (ваше теперь исключенное предложение) является длинным способом записи '.then (function() {return x;})'. –

ответ

1

В коде summoner доступен только для then обратного вызова, содержащий ваш вызов getMatchIds, а не в другом месте. Чтобы быть доступным позже, вам нужно будет либо 1) вернуть его из этого обратного вызова then вместе с игровыми данными, либо 2) установить ответные запросы then, которые нуждаются в нем внутри, что обратный вызов.

Последнее, вероятно, тем легче:

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

так просто подтвердить, что также передадут гамедату моему рендерингу? Cheers это имеет смысл – Elevant

+0

@Elevant: Да, эта часть не затронута. Переместив эти обработчики в обработчик для 'getSummonerData', мы разрешим им закрыть' summoner', но то, что они получают из 'getGameData', не изменяется. –

+0

Спасибо, я все еще изучаю, как функции обратного вызова javascript функционируют как область доступа и т. Д., И просто изучая обещания сейчас, а также ха-ха :) – Elevant

0

Я не уверен, что вы имеете в виду под «обещание функции». Я предполагаю, что вы не знаете, что «тогда» и «поймать» всегда возвращают обещания. Вот почему вы можете связать их. Каждое «то» или «улов» является методом обещания, возвращенного его предшественником. Последовательные обещания позже разрешаются или отклоняются в зависимости от того, что происходит с их предшественниками.

Я предполагаю, что ваша последняя функция 'res.render (...)' возвращает значение, которое вы хотите увидеть. Тогда обещание «then (render (...))» будет разрешено с помощью значения, полученного от «res.render (...)».

Так вот, что «поймать» будет работать: разрешенное обещание со значением, которое вы хотите увидеть. Но «улов» только выполняет свою функцию с «отвергнутым» обещанием. Вместо этого вам нужно «тогда».