2016-05-24 3 views
2

Ich möchte einen JS-Code erstellen, um viele verschachtelte Seiten zu erstellen. Hier ist ein Beispiel mit dem Erstellen von 5 Nest Seiten (5 Tiefenstufen)Wie konvertiere ich diesen Code in verkettete Versprechen?

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'); 
      }); 
     }); 
    }); 
}); 

Wie konvertiere ich über Code eine beliebige Anzahl von Nest-Seiten zu erstellen? Derzeit verwende ich jQuery. Es ist in Ordnung, wenn Sie eine Promise-Bibliothek vorschlagen, um dieses Problem zu lösen.

Vielen Dank.

+1

was Rekursion? – frankenapps

+1

[nenne sie und kette stattdessen] (http://stackoverflow.com/a/2000931/1048572)? – Bergi

Antwort

1

Einfache Rekursion wird ausreichen.

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

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

Versprechen sind so konzipiert, angekettet werden, was Sie zurückkommen von einem done durch die nächste done in der Kette gelöst ist:

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

Einige einfache Rekursion (oder sogar eine Schleife) kann getan werden, mach dies beliebig tief.

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

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

Sie können die Kette sogar eine andere done auf den Aufruf der rekursiven Methode:

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

Meinst du 'return genPagesRecursive (spaceKey, id, - depth)' in deinem done für das rekursive Beispiel? – ste2425

+0

@ ste2425 thanks - hat den Methodennamen zur Hälfte geändert. – Jamiec

+0

Ich habe getestet und es funktioniert wie ein Charme. Danke @Jamiec. Ich habe nicht genug Punkte, um die Antwort zu wählen :( –