以下是在应用程序加载时运行的打字稿代码。我们的想法是执行getSheetList方法,然后运行getBookmarkList,然后填充qlikAppList数组。
如果qlikAppList数组在其末尾为空,则应用程序将返回错误消息"流中的任何应用程序中都不存在工作表。"
在我的本地计算机上,这在大多数情况下都能正常工作,每隔一段时间就会抛出该错误。此代码已部署到服务器,并且每次都会抛出错误消息。
这里有什么问题?
app.runGetAppList().then((appList: IMasterItem[]) => {
let promiseArray: Promise<void>[] = [];
_.each(appList, (appItem) => {
let appInfo = { //few fields };
promiseArray.push(qlik.getSheetList(appItem.id).then((sheetsInfo) => {
if (sheetsInfo.length > 0) {//populate appInfo}
}).then(() => {
bookmarkSvc.getBookmarkList(appItem.id).then((bookmarksInfo) => {
if (bookmarksInfo.length > 0) {//populate appInfo}
this.qlikAppList.push(appInfo);
});
}));
});
Promise.all(promiseArray).then(() => {
this.initializeScreen(this.qlikAppList.length > 0 ? undefined :
"No sheets exist in any of the apps in stream.");
});
public getSheetList(appId): Promise<QlikSheetInfo[]> {
return new Promise((resolve, reject) => {
currentApp.qlikApp.getList("sheet", (sheetList) => {
resolve(sheetList.qAppObjectList.qItems.map((qItem) => {
return {
//some fields
};
}));
});
});
}
public getBookmarkList(appId): Promise<QlikBookmarkInfo[]> {
return new Promise((resolve, reject) => {
currentApp.qlikApp.getList("BookmarkList", (bookmarkList) => {
resolve(bookmarkList.qBookmarkList.qItems.map((qItem) => {
return {
//some fields
};
}));
});
});
}
谢谢!
答案 0 :(得分:1)
将评论升级为答案
你不等getBookmarkList
完成;你在.then()
中启动它,但它立即返回,解决了这个承诺。
您应该从getBookmarkList
返回承诺以使承诺传播。
关于你为何会根据环境偶尔发生的评论:你处于竞争状态。如果至少有一个完成getSheetList
和getBookmarkList
之后才能完成getSheetList
,那么它可以在检查之前将项目添加到qlikAppList
。诸如CPU速度,网络速度/延迟,操作系统线程以及确切如何解决承诺等因素都会影响时序。