替换Safari 8.0中的IndexedDB条目时出错

时间:2014-10-30 16:55:24

标签: javascript angularjs safari indexeddb

我正在为所有使用Karma和Jasmine的浏览器编写IndexedDb Angular模块的单元测试。

每个浏览器都给我预期的行为(甚至是IE 10+),除了Safari 8.0。

在单元测试中,我创建了三个对象作为数组添加到数据库中。 dbHandler是indexedDb处理对象。在使用主键1之前,测试中已存在元素。

var entries = [
  { _id: 1, hello3: "test3" },
  { newObject: true, trueness: false },
  { name: "other object", attributes: ['a', 'b', 'c'] }
];

dbHandler.put(entries).then(function(data){
  expect(data.length).toEqual(3);

  expect(data[0]).toEqual(1);
  expect(data[1]).toEqual(2);
  expect(data[2]).toEqual(3);

  window.clearInterval(interval);
  done();
});

_id是我存储的主键,因此第一个条目应覆盖现有条目。

IndexedDb处理程序的put方法如下所示:

IndexedDbHandler.prototype.put = function (data) {
  var deferer = $q.defer();
  var self = this;

  this.connect().then(function(){
    // create singleton array with data, if data is no array
    if (!(data instanceof Array)) {
      data = [data];
    }
    var addedDataCount = 0;
    var dataLength = data.length;
    var idList = [];

    var transaction = IndexedDbHandler._db.transaction([self._tableName], 'readwrite');


    transaction.oncomplete = function() {
      deferer.resolve(idList);
    };

    [...]

    var objectStore = transaction.objectStore(self._tableName);

    // Add data with _id to the database
    for (var i = 0; i < data.length; i++) {
      objectStore.put(data[i]).onsuccess = function(e) {
        idList.push(e.target.result);
      }
    }
  });

  [...]

  return deferer.promise;
}

此方法返回一个承诺数组,其中包含已保存商店条目的主键。

在Safari 8.0的每个浏览器中,返回的数组都是[1,2,3]。 Safari返回[1,1,2],完全忽略上一次测试中已设置的ID。

当我从第一个_id对象中删除entries时,所有浏览器都会返回相同的值。

这是Safari错误还是我做错了什么?

1 个答案:

答案 0 :(得分:0)

所以我知道我不应该在SO上发布一个链接作为答案,并随意投票,但我的时间有点短,并认为实际上帮助你会受到赞赏,即使它不是“SO方式” - http://www.raymondcamden.com/2014/9/25/IndexedDB-on-iOS-8--Broken-Bad