0

如果我从 Firebase 读取一个值然后将其删除,随后的有限读取(例如 dataRef.limit(10).once("value") )仍将看到删除的值。

如果我进行无限读取,那么我将看不到删除的值,随后的有限读取也将不再看到删除的值。

var gFirebase = new Firebase("https://brianshmrian.firebaseio.com/");

function CreateValue()
{
    gFirebase.child("TestBug/Key").set("Value");
}

function ReadValue(limit)
{
    var dataRef = gFirebase.child("TestBug");
    if (limit)
        dataRef = dataRef.limit(10);

    dataRef.once("value",function(snapshot)
    {
        alert((limit?"Limited read\n":"Normal read\n") + snapshot.val());
    });
}

function RemoveValue()
{
    gFirebase.child("TestBug/Key").remove();
}

在此示例代码中,如果我执行 CreateValue(),然后执行 ReadValue(),然后执行 RemoveValue(),然后执行 ReadValue(true),对象仍将在最后的 ReadValue() 中报告给我。但是,如果我执行 ReadValue(false),我将不再看到该值,随后的 ReadValue(true) 也将看不到该值。

请参阅此处亲自尝试:http: //jsfiddle.net/brianshmrian/5WWR6/

那么这是一个错误吗?还是我犯了一个错误?

编辑

好的,这似乎是一个不太痛苦的解决方法。下面的代码暂时解决了我的问题:

// Need to do this before the remove to avoid caching problem
dataRef.on("value", function(snapshot)
{
    setTimeout(function() { dataRef.off(); }, 3000);
});

dataRef.remove();
4

1 回答 1

0

我找不到代码的任何问题。总是存在同步返回本地缓存数据的问题,但我不认为这是一个问题;在删除完成之前无法调用读取。它看起来像一个非常简单的错误。

limit(10).on('value')我能够通过在调用添加/删除操作之前设置来规避这种行为。所以我认为如果你先建立你的查询参考,你会没事的。

示例: http: //jsfiddle.net/katowulf/6wQFF/2/(pre标签在加载时设置)

于 2013-04-19T16:54:48.053 回答