【问题标题】:Numeric transaction modes are deprecated in IDBDatabase.transaction. Use "readonly" or "readwrite"IDBDatabase.transaction 中不推荐使用数字事务模式。使用“只读”或“读写”
【发布时间】:2012-08-15 17:29:40
【问题描述】:

我在使用 IndexedDB 的应用程序上收到此警告。

“IDBDatabase.transaction 中不推荐使用数字事务模式。使用“readonly”或“readwrite””

当我第一次编写应用程序时(大约几个月前)我没有看到这一点,但似乎每次尝试访问 IDBDatabase.transaction 时都会收到此警告。

在chrome控制台上,可以正确识别下面的事务密钥。

IDBTransaction.READ_WRITE
1
IDBTransaction.READ_ONLY
0

我正在执行 IDB 事务的示例代码:

IndexedDB.set = function(key, obj, onsuccess, oncomplete) {
    var db = IndexedDB.db;
    var trans = db.transaction([key], IDBTransaction.READ_WRITE);
    var objectStore = trans.objectStore(key);
    var request = objectStore.put(obj);

    request.onsuccess = function(e) {
      if (onsuccess !== undefined)
        onsuccess(request.result);
    };

    request.onerror = function(e) {
      console.log("Database error: " + e.target.errorCode);
    };
    trans.oncomplete = function(e) {
      if (oncomplete !== undefined)
        oncomplete(request.result);
    };
  };

我应该担心这个吗?如果是这样,我该如何避免这个警告?

我的 chrome v:版本 21.0.1180.75

感谢您的 cmets。

【问题讨论】:

    标签: indexeddb


    【解决方案1】:

    IndexedDB 标准仍在进行中(尽管版本 1 非常接近完成),最近的更改之一是switching from the numeric constants like "IDBTransaction.READ_WRITE" to just plain strings like "readwrite"。这是一个好主意,因为它使代码更简洁、更易读。

    旧的常量可能会继续工作一段时间,尽管会出现您观察到的警告消息,但现在使用字符串是“正确”的方式,这可能是您应该使用的方式,例如:

        var trans = db.transaction([key], "readwrite");
    

    【讨论】:

    • 感谢 Jeremy 的快速响应。将其切换为字符串后,警告消失了,所有功能仍然有效。您知道此更改是否适用于所有 chrome 版本吗? (使用版本 21.0.1180.75)
    • Chrome 20 是第一个支持新字符串的版本。
    • 感谢 Jeremy,这是否意味着如果我切换到字符串,Chrome v
    • 正确。您可以继续使用旧常量并忽略错误消息,切换到字符串并忽略旧浏览器,或者执行类似于其他答案的操作并同时支持两者。在大多数情况下,我建议只使用字符串,因为旧版本的 FF 和 Chrome 由于自动更新而很少使用,但 YMMV。
    【解决方案2】:

    为了向后兼容,我建议提供一个后备。对于 chrome,我会忽略您收到的警告并继续使用该界面。

    也许可以尝试以下解决方法,使其与后向和前向兼容:

    var transactionType = { READ_ONLY: "readonly", READ_WRITE: "readwrite" }
    if (IDBTransaction.READ_ONLY && IDBTransaction.READ_WRITE){
       transactionType.READ_ONLY = IDBTransaction.READ_ONLY
       transactionType.READ_WRITE = IDBTransaction.READ_WRITE
    }
    
    var trans = db.transaction([key], transactionType.READ_WRITE);
    

    使用此解决方案,您可以确保旧浏览器和新浏览器仍然可以使用。

    【讨论】:

    • 因为 IDBTransaction.READ_ONLY 为 0。JavaScript 不会将其翻译为 false 吗?
    • No javascript 不是强类型语言,但它可以识别类型。如果要在 JS 中使用 true 或 false 则需要使用关键字 true 和 false
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2021-06-07
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多