2016-05-24 9 views
2

Я хочу создать JS-код для создания множества вложенных страниц. Вот пример с созданием 5 гнезд страниц (уровни 5 глубины)Как преобразовать этот код в кодовые обещания?

var self = this; 
var parentPageId = 1; // this is initial data. 

// 1 
this._genPage(spaceKey, parentPageId).done(function (createdPage) { 
    // 2 
    self._genPage(spaceKey, createdPage.id).done(function (createdPage) { 
     // 3 
     self._genPage(spaceKey, createdPage.id).done(function (createdPage) { 
      // 4 
      self._genPage(spaceKey, createdPage.id).done(function (createdPage) { 
       // 5 
       self._genPage(spaceKey, createdPage.id).done(function (createdPage) { 
       Util.showSuccessMessage('Data Generated: 5 nested pages'); 
      }); 
     }); 
    }); 
}); 

Как преобразовать выше код, чтобы создать любое количество гнездовых страниц? В настоящее время я использую jQuery. Это нормально, если вы предлагаете библиотеку Promise для решения этой проблемы.

спасибо.

+1

что об использовании рекурсии? – frankenapps

+1

[отключить их и цепочку вместо этого] (http://stackoverflow.com/a/22000931/1048572)? – Bergi

ответ

1

Простая рекурсия.

function createNestedPages(spaceKey, parentPageId, numberOfPages) { 
    if (numberOfPages <= 0) { 
    return; 
    } 

    this._genPage(spaceKey, parentPageId).done(function (createdPage) { 
    createNestedPages(spaceKey, createPage.id, numberOfPages - 1); 
    }); 
} 
2

обещания предназначены быть прикованным, то, что вы вернетесь из одного done решается следующей done в цепи:

this._genPage(spaceKey, parentPageId) 
    .done(function (createdPage) { 
     return self._genPage(spaceKey, createdPage.id); 
    }).done(function (createdPage) { 
     return self._genPage(spaceKey, createdPage.id); 
    }); // etc 

Некоторые простые рекурсии (или даже цикл) может быть сделано для сделайте это на любом уровне уровней.

function genPagesRecursive(spaceKey, id, depth){ 
    if(depth == 0){ 
     return 'Data Generated'; 
    } 

    return self._genPage(spaceKey, id).done(function(createdPage){ 
     return genPagesRecursive(spaceKey,id,--depth); 
    }) 
} 

Вы можете даже приковать другой done при вызове рекурсивного метода:

genPagesRecursive(spaceKey, creadtedPage.id, 5).done(function(msg){ 
    Util.showSuccessMessage(msg);   
}); 
+0

Вы имеете в виду 'return genPagesRecursive (spaceKey, id, - depth)' в вашем сделанном для рекурсивного примера? – ste2425

+0

@ ste2425 спасибо - изменил имя метода на полпути. – Jamiec

+0

Я тестировал и работает как шарм. Спасибо @Jamiec. У меня недостаточно очков, чтобы проголосовать за ответ :( –

Смежные вопросы