AngularJS中PouchDB Promise工作流问题:put先于destroy执行报错
问题根源与解决方案
兄弟,你猜的一点没错!问题就出在Promise的链式调用没处理到位,异步操作的顺序完全乱了~
你当前的代码里,db.destroy()是异步执行的,但你没有把db.put()放到它的回调链里——这意味着不管数据库销毁有没有完成,db.put()都会立刻启动。这时候要么原数据库还没销毁干净,要么新的数据库实例还没创建好,自然会触发报错。
要解决这个问题,必须严格按照「销毁数据库→创建新库→存入数据」的顺序,用Promise的链式调用把这些异步操作串起来,确保前一步完成后才执行下一步。
修改后的代码示例
// 假设stuffInsideDB是你之前判断数据库是否有内容的依据 if (stuffInsideDB != undefined && stuffInsideDB !== '') { db.destroy() // 销毁成功后,创建新的数据库实例 .then(function() { db = new PouchDB('DB'); return db.info(); // 返回Promise,继续链式调用 }) // 数据库准备就绪后,执行存入操作 .then(function() { return db.put({ _id: (currentIndex + 1).toString(), "data": encryptedHex.toString() }); }) // 存入成功后的后续操作 .then(function() { // do something console.log('数据已成功存入新数据库'); }) // 捕获所有环节可能出现的错误(销毁失败、存入失败等) .catch(function(error) { console.error('操作出错:', error); }); } else { // 如果数据库原本就没有内容,直接执行存入操作 db.put({ _id: (currentIndex + 1).toString(), "data": encryptedHex.toString() }) .then(function() { // do something console.log('数据已存入现有数据库'); }) .catch(function(error) { console.error('存入数据出错:', error); }); }
关键注意点
- 异步顺序必须通过Promise链式保证:PouchDB的所有核心操作都是异步的,不能像同步代码那样写,必须用
.then()把操作按顺序串起来。 - 不要忽略错误捕获:加上
.catch()可以统一处理销毁、创建、存入过程中出现的任何错误,方便调试问题。 - 确保新数据库实例创建后再操作:一定要在
db.destroy()的回调里创建新的PouchDB实例,避免引用旧的数据库对象。
内容的提问来源于stack exchange,提问作者giovandrea
相关产品推荐
相关产品推荐

