【发布时间】:2017-10-25 07:08:00
【问题描述】:
以下是在应用程序加载时运行的打字稿代码。想法是执行 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
};
}));
});
});
}
谢谢!
【问题讨论】:
-
TypeScript 没有承诺。因此,“TypeScript 承诺 [are] 没有正确执行”不可能是这种情况。 Promise 是标准 JS 库的一部分。有关调试代码的更多帮助,请提供一个最小的示例,去掉所有不必要的内容。这里没有人有时间查看您的近一百行代码。
-
感谢您的评论。我已经缩减了代码以使其更简洁。
-
你不是在等待
getBookmarkList完成 -
如何等待 getBookmarkList 完成? Javascript菜鸟:(
-
我习惯等待/异步,但我认为在这里添加一个返回:
return bookmarkSvc.getBookmarkList...应该可以工作
标签: typescript promise