Javascript承诺循环多次

时间:2017-05-08 06:45:07

标签: javascript typescript

我有一个Javascript承诺,它返回一个项目列表。

findMessages(chatItem: any): Promise<any[]> {
    return new Promise<any[]>((resolve) => {
        let items: any[] = [];
        let promiseArray: Promise<any>[] = [];
        this.storage.keys().then((keys: string[]) => {
            for (let i: number = 0; i < keys.length; i++) {
                if (keys[i] && keys[i].startsWith(this.me.uid + 'message/')) {
                    let promise: Promise<any> = this.storage.get(keys[i])
                    promise.then((data: string) => {
                        let item: any = JSON.parse(data);
                        if ((item && item.memberId1 === chatItem.memberId1 && item.memberId2 === chatItem.memberId2)
                            || (item && item.memberId1 === chatItem.memberId2 && item.memberId2 === chatItem.memberId1)) {
                            items.push(item);
                        }
                    });
                    promiseArray.push(promise);
                }
            }
            Promise.all(promiseArray).then(() => {
                resolve(items);
            });
        });
    });
}

这个承诺在下面被称为。

findMessages(chatItem: any): Observable<any[]> {
    return Observable.create((observer) => {
        this.firebaseDataService.findMessages(chatItem).forEach(firebaseItems => {
            this.localDataService.findMessages(chatItem).then((localItems: any[]) => {
                let mergedItems: any[] = this.arrayUnique(firebaseItems.concat(localItems), false);
                mergedItems.sort((a, b) => {
                    return parseFloat(a.negativtimestamp) - parseFloat(b.negativtimestamp);
                });
                if (this.me && mergedItems && mergedItems[0] && this.me.uid === mergedItems[0].memberId2) {
                    this.updateChatWithMessage(chatItem, mergedItems[0], false);
                }
                observer.next(mergedItems);
            });
        });
    });
}

问题

在承诺调用之后,我希望以下行只能被称为一次

let mergedItems: any[] = this.arrayUnique(f....

但是,如果我在此行上放置一个断点,则从promise返回时会多次调用它。它被称为等于从promise(localitems)返回的项数的次数。好像它在localitems上循环。

我可能错误地构建了我的代码,任何建议都会受到赞赏。

由于

0 个答案:

没有答案