gpt4 book ai didi

javascript - 在 JavaScript Promise 中正确使用 then

转载 作者:行者123 更新时间:2023-12-02 14:40:05 24 4
gpt4 key购买 nike

我在正确处理各种 promise 的响应时遇到一些问题。

简要背景:我正在使用 Ionic2(基于 Angular2)创建移动应用程序。数据持久化基于SQLite。为了重新构建包含嵌套数组的复杂对象,我需要将多个数据库调用链接在一起。

在下面的方法中,我正在获取 ScheduledEvents 的列表。对于每个事件,我然后获取其关联的对象(在 buildObjectFromID 中显示)-> 由于 Returning objects created by chained javascript promises,此方法效果很好。

但是,当返回此对象时,我希望 getSchedule() 方法仅在 forEach 部分中处理完所有元素后才返回更新的列表。目前,scheduledEvents 对象似乎是立即返回的,并且随着方法的继续执行,实际上会随着时间的推移而更新。

schedule-controller.js

 getSchedule() {

let db = new DBHelper();
let scheduleController = new ScheduleController();

return db.getScheduledEvents().then(scheduledEvents => {
// For each scheduled event, get the related object
scheduledEvents.forEach(scheduledEvent => {
scheduleController.buildObjectFromId(scheduledEvent.id).then(relatedObject => {
//update object with new property
scheduledEvent.data = relatedObject;
});
}).then(() => {
//Once all properties have been updated, return updated array
return scheduledEvents;
});
});
}


buildObjectFromID(id) {

let db = new DBHelper();
return db.getSpeakerWithCMSID(id).then(speaker => {
return Promise.all([
db.getBannerForOwner(speaker.cmsId).then(banner => {
speaker.banner = banner;
}),
db.getImagesForOwner(speaker.cmsId).then(images => {
speaker.images = images;
}),
db.getProfilePicturesForOwner(speaker.cmsId).then(profilepictures => {
speaker.profilepicture = profilepictures;
})
]).then(() => {
return speaker;
});
});

我将非常感谢任何帮助或指导。谢谢。

最佳答案

您忘记返回 scheduledEvents.forEach().then() 的结果,否则 getSchedule() 返回的 Promise 将立即解析为 未定义

(我假设 scheduledEvents.forEachArray.forEach 的一些抽象,它在迭代完成后返回一个 Promise,而不是 Array.forEach code> 本身,否则它的结果甚至不会有 then 方法。)

return db.getScheduledEvents().then(scheduledEvents => {
// For each scheduled event, get the related object
return scheduledEvents.forEach(scheduledEvent => {
scheduleController.buildObjectFromId(scheduledEvent.id).then(relatedObject => {
//update object with new property
scheduledEvent.data = relatedObject;
});
}).then(() => {
//Once all properties have been updated, return updated array
return scheduledEvents;
});
});

(您也可以将 () => { return foo; } 替换为 () => foo)

<小时/>

实际上,我认为 scheduledEvents.forEach 不可能有任何特别之处并且仍然有效。即使它是一个返回 Promise 的抽象,您似乎也在 lambda 内部进行异步工作,但也没有返回这些 Promise。所以我开始认为这只是常规的 Array.forEach 并且你也在那里犯了一个错误。

在这种情况下,您想要的是 Array.map 创建一个您想要在各个 ScheduledEvents 上执行的工作的 Promise 数组,然后使用 Promise.all 等待它们

return db.getScheduledEvents().then(scheduledEvents => {
// For each scheduled event, get the related object
return Promise.all(scheduledEvents.map(scheduledEvent => {
return scheduleController.buildObjectFromId(scheduledEvent.id).then(relatedObject => {
//update object with new property
scheduledEvent.data = relatedObject;
});
})).then(() => {
//Once all properties have been updated, return updated array
return scheduledEvents;
});
});

关于javascript - 在 JavaScript Promise 中正确使用 then,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37077193/

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