我開發了一個Ionic 3應用程序,它可以根據需要緩存文章內容列表。我正在使用Storage
,它使用承諾進行操作。如何在Ionic 3中執行多個異步操作並在完成所有操作後關閉加載程序?
我的代碼如下:
物品service.ts
getArticleFullData(articleId: number) {
let appSettings = this.appSettingsService.getSettings();
let params = this.utilsService.serializeQueryParams(appSettings);
let url = `${this.apiBasePath}Article/GetArticleFullData?articleId=${articleId}&${params}`;
this.loggingService.logInfo("Getting article full data from url " + url);
return this.http.get(url)
.map(res => res.json());
}
文章-緩存service.ts
// saves a single article to the cache
private saveToCache(articleId: number): Observable<any> {
let key = articleId;
let obs = this.articleService.getArticleFullData(key);
obs.subscribe(data => {
this.storage.set(this.GetArticleFullKey(key), data as ArticleFullData);
},
err => {
this.loggingService.logError("Failed to cache data for article: " + key);
}
);
return obs;
}
// tries to cache a list of article in the cache
// avoids overwriting the data, if exists
public saveArticleDataToCache(articles: ArticleBriefData[]): Observable<{}[]> {
var obsArray = [];
for (let article of articles) {
let key = this.GetArticleFullKey(article.ArticleId);
this.storage.get(key)
.then(data => {
console.log("Storage data for article " + key, data);
if (!data) {
obsArray.push(this.saveToCache(article.ArticleId));
}
})
.catch(err => {
this.loggingService.logError("Failed to check storage for key " + key, err);
});
}
var ret = Observable.forkJoin(obsArray);
return ret;
}
包含代碼裝載機
this.loadingCtrl.create({ content: "Caching data. Please wait..." });
this.loadingCtrl.present();
var all = this.articleCacheService.saveArticleDataToCache(this.articles);
var subscr = all
.toPromise()
.then(data => {
console.log("All data: ", data);
this.loadingCtrl.dismiss();
this.loggingService.logInfo("Successfully cached articles ");
})
.catch(err => {
this.loadingCtrl.dismiss();
this.loggingService.logError("Failed to cache data: ", JSON.stringify(err));
}
);
緩存過程正確執行,但then
代碼,立即執行(data
是undefined
)
我也曾嘗試subscribe
的方法,但內subscribe
代碼似乎並沒有被執行(緩存爲正確執行,雖然):
var all = this.articleCacheService.saveArticleDataToCache(this.articles);
var subscr = all
.subscribe(data => {
console.log("All data: ", data);
this.loadingCtrl.dismiss();
this.loggingService.logInfo("Successfully cached articles ");
},
err => {
this.loadingCtrl.dismiss();
this.loggingService.logError("Failed to cache data: ", JSON.stringify(err));
}
);
我顯然無法與Observable
工作在這兒。
問題:如何在Ionic 3中執行多個異步操作並在完成所有操作後關閉加載程序?
感謝您的快速答覆。我正在使用'rxjs 5.4.0'。我的代碼已經使用'forkJoin',但它不能按預期工作。它可能與'getArticleFullData'的作用有關,但我無法弄清楚什麼是錯誤的(我也添加了該函數的代碼)。 – Alexei
試着'let'而不是'var'來看看。 – Sampath
也似乎你沒有正確使用'forkjoin'。我已更新我的帖子。希望你能更好地瞭解如何使用'forkjoin'。 – Sampath