【问题标题】:Promises not executing correctlyPromise 没有正确执行
【发布时间】: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


【解决方案1】:

将 cmets 升级为答案

您无需等待getBookmarkList 完成;您在 .then() 中启动它,但它立即返回,解决了承诺。

您应该从getBookmarkList 返回承诺以使承诺传播。

至于你关于为什么它会根据环境偶尔发生的评论:你处于竞争条件领域。如果至少有一个人在完成getSheetList 之前完成了getSheetList 和getBookmarkList,那么它就可以在检查之前向qlikAppList 添加一个项目。 CPU 速度、网络速度/延迟、操作系统线程以及如何准确地解决承诺等因素都会影响时间。

【讨论】:

  • 感谢您解释为什么它只在某些环境中发生。
猜你喜欢
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-06
  • 2020-05-27
  • 2015-01-02
  • 2018-12-07
相关资源
最近更新 更多