Я работаю над простым приложением Windows 8, в котором мне нужно получить набор данных с веб-сайта. Я использую WinJS.xhr() для извлечения этих данных, которые возвращают Promise. Затем я передаю обратный вызов в этот метод Promise.then(), который поставляет мой обратный вызов с возвращаемым значением из асинхронного вызова. Метод .then() возвращает другое обещание, предоставляя ему значение, возвращаемое моим обратным вызовом. Основная структура такого запроса будет следующей:
WinJS.xhr({ url: "http://www.example.com/" }).then(
function callback( result_from_xhr )
{
//do stuff
return some_value;
}).then(
function secondcallback( some_value )
{
//do stuff
});
Однако в моей ситуации мне может потребоваться дополнительные запросы для данных в зависимости от данных, возвращаемых первым запросом, и, возможно, больше запросов в зависимости от данных THAT... и т.д., рекурсивно.
Мне нужен способ закодировать это так, что final.then() не будет выполняться до тех пор, пока ВСЕ рекурсии не будут завершены, аналогично этому:
function recurse() {
return WinJS.xhr({ url: "http://www.example.com/" }).then(
function callback( result_from_xhr )
{
if( result_from_xhr == something )
{
recurse();
}
});
}
recurse().then(
function final()
{
//finishing code
});
Проблема состоит в том, что, конечно, код завершения вызывается, как только завершается первый уровень рекурсии. Мне нужно каким-то образом вложить новое обещание и старое обещание в рамках обратного вызова.
Надеюсь, мой вопрос достаточно ясен, я действительно не уверен, как это объяснить, и, откровенно говоря, идея асинхронного рекурсивного кода заставляет мою голову болеть.