2016-10-28 1 views
0

Это мое первое сообщение, поэтому я надеюсь, что сделаю все правильно. Это мое первое знакомство с обещаниями и 3 часа. Я все еще не могу это получить. К сожалению, у нашего проекта нет поддержки Async Wait. Я использую pouchdb над sqlite.Как дождаться обещания машинописного текста/javascript перед возвратом значения

Этот.recipes используется для отображения страницы рецептов. Он возвращается как пустой, однако в первый раз, а затем всегда отстает от одного рецепта после добавления каждого рецепта. Я уверен, что это потому, что я возвращаю this.recipeBook, прежде чем все обещания будут завершены. Я понимаю, что в коде, который я опубликовал, окончательный возврат болтается вне любого обещания, но когда я положил его на обещание, я получаю «тип void, который нельзя назначить для ввода любой ошибки []» в моей RecipesPage.ts.

Я ценю любую поддержку, которую вы, ребята, можете предложить, и я взволнован, чтобы узнать правильный способ передать это, и заблаговременно благодарю вас.

Это мой звонок в RecipesPage.ts:

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

Это метод в 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

Вы не ждете - Javascript не работает таким образом. Вероятно, вы должны прочитать [Как вернуть значение из асинхронной операции] (http://stackoverflow.com/questions/14220321/how-do-return-the-response-from-an-asynchronous-call). Ответ в том, что вы этого не делаете. Вместо этого вы запрограммируете асинхронный отклик и выполняете следующую операцию только в том случае, если вы получили уведомление о завершении операции async. – jfriend00

ответ

0

Вы не делаете. Нет никакого реального способа «распаковать» такое обещание. Самое близкое, что вы можете реально получить, - это опрос.

Вместо этого верните обещание и позвоните. Затем пообещайте, где вы его ждёте. Это в конечном счете то, что async и ждут делают под капотом. Принимайте решения в пользовательском интерфейсе, чтобы выбрать способ отображения вашего контента до его загрузки (и его загрузки).