承诺没有正确执行

时间:2017-10-24 21:17:08

标签: typescript promise

以下是在应用程序加载时运行的打字稿代码。我们的想法是执行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
                };
            }));
        });
    });
}

谢谢!

1 个答案:

答案 0 :(得分:1)

将评论升级为答案

你不等getBookmarkList完成;你在.then()中启动它,但它立即返回,解决了这个承诺。

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

关于你为何会根据环境偶尔发生的评论:你处于竞争状态。如果至少有一个完成getSheetListgetBookmarkList之后才能完成getSheetList,那么它可以在检查之前将项目添加到qlikAppList。诸如CPU速度,网络速度/延迟,操作系统线程以及确切如何解决承诺等因素都会影响时序。