gpt4 book ai didi

Javascript Promise 循环多次

转载 作者:行者123 更新时间:2023-12-03 04:23:27 25 4
gpt4 key购买 nike

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

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);
});
});
});
}

这个 Promise 的名称如下。

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);
});
});
});
}

问题

在 promise 调用之后,我希望以下行仅被调用一次:

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

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

我的代码结构可能不正确,任何建议将不胜感激。

谢谢

最佳答案

由于您没有使用 firebase 项作为检索 Promise 的参数,因此您可以在运行 foreach 循环之前进行返回 Promise 的调用。我猜你的问题是,由于 Promise 位于 for Each 循环内,因此它会触发为每个 Firebase 项目解决的大量 Promise。

findMessages(chatItem: any): Observable<any[]> {
return Observable.create((observer) => {
this.localDataService.findMessages(chatItem).then((localItems: any[]) => {
this.firebaseDataService.findMessages(chatItem).forEach(firebaseItems => {
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);
});
});
});
}

关于Javascript Promise 循环多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43841354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com