如何用Promise.all()包裹localForage setItem调用解决登录后IndexedDB刷新问题
解决:1000+次localForage setItem调用未完成就跳转的问题
你这个问题的核心在于,那1000+次localForage.setItem调用都是异步操作,页面跳转的时候它们还没全部执行完就被中断了。用Promise.all()把这些异步操作打包起来,等所有存储完成后再跳转就能解决问题。
下面是修改后的完整代码:
var app = { Login: function () { WebService.Login($("#username").val(), $("#password").val()) .then(function () { UpdateData() .then(function() { // 确保所有数据都写入IndexedDB后再跳转 window.location.href = '/Home'; }) .catch(function(storageErr) { // 处理数据刷新过程中的错误,比如提示用户或阻止跳转 console.error("数据刷新失败:", storageErr); alert("数据更新失败,请重新登录"); }); }) .catch(function (loginErr) { console.log("登录错误:", loginErr); }); } }; function UpdateData() { // 假设你有需要批量存储的数据集合,比如dataList(根据你的实际数据调整) const storageTasks = []; // 遍历数据,将每个setItem的Promise加入任务列表 dataList.forEach(function(item, index) { // 自定义key,根据你的业务场景设置合适的键名 const storageKey = `user-data-${index}`; // localForage.setItem返回Promise,直接推入数组 storageTasks.push(localForage.setItem(storageKey, item)); }); // 返回Promise.all,等待所有存储任务完成 return Promise.all(storageTasks); }
关键细节说明:
- 收集异步任务:每一次
localForage.setItem都会返回一个Promise对象,我们把这些Promise全部收集到storageTasks数组中。 - 等待全部完成:
Promise.all(storageTasks)会等待数组里的所有Promise都成功执行完毕(也就是所有数据都写入IndexedDB),才会触发后续的then回调执行跳转。 - 错误兜底:如果任何一个存储操作失败,
Promise.all会立即进入catch回调,你可以在这里添加错误处理逻辑(比如提示用户、记录日志或者阻止跳转)。
这样修改后,就能保证所有数据都刷新完成后,页面才会跳转到首页,不会出现存储操作被中断的情况。
内容的提问来源于stack exchange,提问作者sreimer
相关产品推荐
相关产品推荐

