我正在尝试"安全地"添加一个项目到我的Firebase "播放器"集合,即:检查远程错误(服务器关闭,链接关闭,…),以便能够通知用户请求添加操作的(临时)失败。
这是我当前的代码:
app.factory('playersFactory',
function($firebase, FIREBASE_URL) {
var url = FIREBASE_URL + '/' + 'players';
var ref = new Firebase(url);
var players = $firebase(ref);
return {
add: function(player) {
return players.$add(player).then(
function (ref) {
var id = ref.name();
console.error('SUCCESS: added player with id:', id);
return id;
},
function (err) {
console.error('ERROR:', err);
return null;
}
);
}
// ...
}
}
);
我的问题是:
- 我的代码有效吗?(我没有找到任何参考-我的错,当然-关于捕获角火错误的建议方法…)。
- 是我使用第二个回调到
$add(player).then(
捕捉错误是有效的吗?我想它不是,因为我试图模拟在"添加"之前拔掉网络电缆的失败,并且没有显示错误… - 用firebase捕获这些错误的努力是真正需要的吗?
这个方法看起来是正确的。$add是添加项目的理想方式,您希望它们按照时间顺序反刍,并具有唯一的id。正如您所发现的,应该使用then()来捕获错误。
注意,您不会因为拔掉网线而产生错误。Firebase是容错的,将在本地应用更改,等待连接恢复后再发送到服务器。您最好通过设置一个安全规则来创建一个错误条件,以防止对有问题的路径进行写操作。
".write": "!newData.child('shouldFail').exists()" // for example
你可能还想看看MockFirebase。它在每个方面都不完整,也没有完整的文档,但用于测试AngularFire。像其他Angular模拟(比如$http)一样,它的工作原理是使用flush()方法来根据你的判断触发回调,允许你复杂地控制事件何时触发,以可控的方式模拟异步。还有一个failNext方法,目前只在set()上起作用,但要将其添加到需要使用的任何其他方法中需要几分钟的工作。