在 indexedDB 中访问有关导致请求出错的数据对象的信息

Accessing information about data objects that caused a request to error in indexedDB

如果对 indexedDB 的请求失败,错误处理程序中是否有办法记录有关未添加到数据库的数据对象的信息?我在事件对象中寻找它,但没有找到任何东西。

在下面的代码中,我尝试将文本文件 t 中的数据元素 d 写回对象存储 s 但不希望事务滚动如果一个或多个数据元素错误,则返回。如果有错误,我想把失败的数据记录在req_err数组中,继续写入"good"数据。 "bad" 数据将显示给用户以更正或丢弃。

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

当变量req是标量时,解析失败的数据元素被毫无问题地记录下来,因为循环计数器i的值被用作引用数据的索引来自数组 n,在使用时是 "current"。但是导致添加请求失败的数据不能使用循环计数器作为参考,因为到请求完成时,循环已完成并且 i 等于 l,最高值的循环。对象 q 也是如此。它始终是此时文件中的最后一个数据元素。我需要类似事件处理程序的闭包。

我的问题是 iq 是否可以在不创建 req 数组并将它们添加为数组属性的情况下提供给 req.onerror 事件处理程序?或者,是否有更好的访问方式?

谢谢。

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

it seems that there should be a way to do so without making the requests elements of an array and adding properties to the request objects, and then accessing them using this in the error event handler.

可以避免使用数组,但是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}`);
  };
});