2016-10-28 3 views
0

Dies ist mein erster Beitrag, also hoffe ich, dass ich es richtig mache. Dies ist meine erste Begegnung mit Versprechungen und 3 Stunden in denen ich es immer noch nicht verstehe. Unser Projekt unterstützt leider nicht Async Wait. Ich benutze Pouchdb über SQLite.Wie man auf Typoskript/Javascript Versprechen wartet, bevor es Wert zurückgibt

this.recipes wird verwendet, um eine Seite mit Rezepten anzuzeigen. Es erscheint jedoch beim ersten Mal leer und hinterlässt immer ein Rezept, nachdem jedes Rezept hinzugefügt wurde. Ich bin mir ziemlich sicher, dass dies der Fall ist, weil ich dieses.recipeBook zurückschicke, bevor alle Versprechen abgeschlossen sind. Ich erkenne in dem Code, den ich gepostet habe, dass die letzte Rendite außerhalb jedes Versprechens baumelt, aber wenn ich es in ein Versprechen bringe, bekomme ich einen "type void ist nicht zuweisbar, um irgendwelche []" Fehler in meiner RecipesPage.ts einzugeben.

Ich freue mich über jede Unterstützung, die Sie Jungs bieten können und freue mich, den richtigen Weg zu erfahren, dies zu übergeben, und danke Ihnen im Voraus.

Das ist mein Ruf in RecipesPage.ts:

this.recipes = this.database.getAllRecipes(); 

Dies ist die Methode in database.service.ts:

public getAllRecipes() { 
this.recipeBook = new Array<Recipe>(); 

this.recipeDatabase.allDocs 
({ 
    include_docs: true, 
}).then(docs => { 
    this.objectArray = docs.rows.map(row => { 
    return row.doc; 
    }) 
}).then(function(){ 
    for (let object of this.objectArray) { 
    this.myRecipe = this.convertObjectToRecipe(object); 
    this.recipeBook.push(this.myRecipe); 
    } 
}) 
return this.recipeBook; 
} 
+0

Sie warten nicht - Javascript funktioniert nicht so. Sie sollten wahrscheinlich lesen [Wie gebe ich Wert von einem asynchronen Vorgang zurück] (http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call). Die Antwort ist, dass du es nicht tust. Stattdessen programmieren Sie für eine asynchrone Antwort und Sie führen Ihre nächste Operation nur aus, wenn Sie über den Abschluss der asynchronen Operation benachrichtigt werden. – jfriend00

Antwort

0

Sie dies nicht tun. Es gibt keine echte Möglichkeit, ein solches Versprechen auszupacken. Das nächste, was Sie realistisch erreichen können, ist das Polling.

Geben Sie stattdessen das Versprechen zurück und rufen Sie dann das Versprechen auf, auf das Sie warten. Dies ist letztlich was async und warten unter der Haube tun. Treffen Sie Entscheidungen in der Benutzeroberfläche, um auszuwählen, wie der Inhalt gerendert wird, bevor er geladen wird (und wie er geladen wird).

Verwandte Themen