访问有关导致indexedDB错误的数据对象的信息

时间:2018-07-23 05:49:16

标签: javascript function closures indexeddb

如果对indexedDB的请求失败,那么错误处理程序中是否可以记录未添加到数据库的有关数据对象的信息?我在事件对象中寻找它,但是什么也没找到。

在下面的代码中,我试图将数据元素d从文本文件t写回到对象存储s,但不希望事务在以下情况下回滚一个或多个数据元素错误。如果有错误,我想在req_err数组中记录失败的数据,然后继续写入“好”数据。 “错误”数据将显示给用户以更正或丢弃。

下面的代码现在可以正常工作,但是似乎应该有一种方法,而无需制作数组的请求元素并将属性添加到请求对象,然后使用this访问它们在错误事件处理程序中。

当变量req是标量时,由于循环计数器i的值(用作索引来引用数组中的数据的索引),因此没有问题地记录了未能解析的数据元素n在使用时是“当前”的。但是,导致添加请求失败的数据不能使用循环计数器作为参考,因为在请求完成时,循环结束并且i等于l,即最高值的循环。对象q也是如此。此时,它始终是文件中的最后一个数据元素。我需要关闭事件处理程序。

我的问题是,iq是否可用于req.onerror事件处理程序,而无需创建req数组并将其添加为属性?还是有一种更好的方式来访问它们?

谢谢。

for ( i = 1; i < l; i++ )
  { 
    d = t.substring( x, x + map[i] ); 
    try
      {
        q = JSON.parse( d  ); 
      }
    catch
      {
        q = { "id" : n[i].key, "data" : "empty data object to be inserted here later" }; 
        req_err[ err_cnt ] = { 'q' : n[i].q, 'key' : n[i].key, 'data' : d, 'error' : "Failed to parse the string to an object." };
        err_cnt = err_cnt + 1;
      }
    finally
      {
        x = x + map[i]; 
      }  

    req[i] = s.add( q ); 
    req[i].i = i;
    req[i].q = q;


    req[i].onerror = function( event ) 
      {
        event.preventDefault(); 
        event.stopPropagation();
        req_err[ err_cnt ] = { 'q' : n[this.i].q, 'key' : n[this.i].key, 'data' : this.q, 'error' : event.target.error };
        err_cnt = err_cnt + 1;
      }; // close req.onerror

    req[i].onsuccess = function( event )
      {
        $("#msg").text( 'Processed data element : ' + this.i + ' of ' + l ); 
      };

  }; // next i

1 个答案:

答案 0 :(得分:1)

  

似乎应该有一种方法,而无需制作数组的请求元素并将属性添加到请求对象,然后在错误事件处理程序中使用此方法访问它们。

您可以避免使用数组,但是API不提供参数。您确实需要自己存储它们-我将其放在IDBRequest对象上,然后使用闭包或this。这是我的处理方式:

const records = [...];
records.forEach(record => {
  const request = store.put(record);
  request.put_value = record;
  request.onerror = e => {
    console.log(`failed to put: ${request.put_value}: ${e.message}`);
  };
});
相关问题