我有一个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
上循环。
我可能错误地构建了我的代码,任何建议都会受到赞赏。
由于