setitems-indexeddb.js 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import { executeCallback, forEachItem } from './utils';
  2. export function setItemsIndexedDB(items, keyFn, valueFn, callback) {
  3. var localforageInstance = this;
  4. var promise = localforageInstance.ready().then(function () {
  5. return new Promise(function (resolve, reject) {
  6. // Inspired from @lu4 PR mozilla/localForage#318
  7. var dbInfo = localforageInstance._dbInfo;
  8. var transaction = dbInfo.db.transaction(dbInfo.storeName, 'readwrite');
  9. var store = transaction.objectStore(dbInfo.storeName);
  10. var lastError;
  11. transaction.oncomplete = function() {
  12. resolve(items);
  13. };
  14. transaction.onabort = transaction.onerror = function(event) {
  15. reject(lastError || event.target);
  16. };
  17. function requestOnError(evt) {
  18. var request = evt.target || this;
  19. lastError = request.error || request.transaction.error;
  20. reject(lastError);
  21. }
  22. forEachItem(items, keyFn, valueFn, function(key, value) {
  23. // The reason we don't _save_ null is because IE 10 does
  24. // not support saving the `null` type in IndexedDB. How
  25. // ironic, given the bug below!
  26. // See: https://github.com/mozilla/localForage/issues/161
  27. if (value === null) {
  28. value = undefined;
  29. }
  30. var request = store.put(value, key);
  31. request.onerror = requestOnError;
  32. });
  33. });
  34. });
  35. executeCallback(promise, callback);
  36. return promise;
  37. }