Firebase 4.12.0中remove/set/once无法调用.then()的问题求助
解决Firebase 4.12.0中
remove()/set()/once()无法调用.then()的问题 我一眼就看出问题所在了——你现在用的是旧版Firebase Legacy Web SDK的初始化方式(new Firebase(...)),而你看到的“大多数方法返回Promise”的文档描述,是针对新版Firebase Web SDK的,这两套API的差异直接导致了你遇到的报错。
问题根源
旧版Legacy SDK的remove()、set()、once()这些方法并不返回Promise,它们只支持传入回调函数来处理操作结果。所以当你尝试调用.then()时,自然会得到Cannot read property 'then' of undefined的错误——因为这些方法本身没有返回任何值(或者说返回了undefined)。
解决方案
这里有两个可行的方案,优先推荐第一个:
方案1:切换到新版SDK的写法(官方推荐)
Firebase 4.x已经属于新版SDK的版本序列了,你只需要调整初始化和引用的写法,就能原生用上Promise支持:
// 全局初始化一次Firebase App firebase.initializeApp({ databaseURL: FBURL // 填入你的数据库URL }); // 获取目标数据引用 const collab_ref = firebase.database().ref('collaboration_songs').child(collaboration_id); // 现在就能正常调用.then()了 return collab_ref.remove().then(function() { return cb(); });
新版SDK不仅原生支持Promise,还在后续版本中持续维护更新,建议彻底迁移过来,避免后续遇到更多兼容问题。
方案2:手动包装Promise(临时兼容)
如果暂时没办法切换SDK,你可以把旧版的回调式方法手动包装成Promise来使用:
// 封装一个返回Promise的remove方法 function promisifyRemove(ref) { return new Promise((resolve, reject) => { ref.remove(error => { if (error) { reject(error); } else { resolve(); } }); }); } // 使用封装后的方法 const collab_ref = new Firebase(FBURL + 'collaboration_songs').child(collaboration_id); return promisifyRemove(collab_ref).then(function() { return cb(); });
同理,set()和once()也可以用同样的逻辑封装,把回调的结果对应传递给resolve或reject即可。
额外提醒
旧版Legacy SDK已经停止官方维护,不会再有新特性和安全更新,所以尽量尽快迁移到新版SDK,从根源上避免这类问题。
内容的提问来源于stack exchange,提问作者Thalatta
相关产品推荐
相关产品推荐

