Используйте cursor.continue() в обратном вызове

Я пытаюсь использовать cursor.continue() в обратных вызовах chrome.tabs.update(). Я всегда получаю следующую ошибку.

DOM IDBDatabase Exception 0 Ошибка: был размещен запрос на транзакцию, которая либо в настоящее время не активна, либо завершена.

Error in event handler for 'undefined': TransactionInactiveError: DOM IDBDatabase Exception 0 Error: A request was placed against a transaction which is either currently not active, or which is finished.
at chrome-extension://fiipdmhnjimefhdbdfpgllkckomakfkh/sample.js:62:20
at miscellaneous_bindings:288:9
at chrome.Event.dispatchToListener (event_bindings:390:21)
at chrome.Event.dispatch_ (event_bindings:376:27)
at chrome.Event.dispatch (event_bindings:396:17)
at Object.chromeHidden.Port.dispatchOnMessage (miscellaneous_bindings:254:22)     event_bindings:380
chrome.Event.dispatch_ event_bindings:380
chrome.Event.dispatch event_bindings:396
chromeHidden.Port.dispatchOnMessage

Код:

//background.js
store = getObjectStore(DB_STORE_NAME, 'readwrite');
var req;
req = store.count();

req.onsuccess = function(evt) {
  console.log('<p>There are <strong>' + evt.target.result +
                 '</strong> record(s) in the object store.</p>');
                // store = getObjectStore(DB_STORE_NAME, 'readwrite');
};
req.onerror = function(evt) {
  console.error("add error", this.error);
 // store = getObjectStore(DB_STORE_NAME, 'readwrite');
  //displayActionFailure(this.error);
};

  var i = 0;
req = store.openCursor();
req.onsuccess = function(evt) {
  cursor = evt.target.result;
//store = getObjectStore(DB_STORE_NAME, 'readwrite');
  // If the cursor is pointing at something, ask for the data
  if (cursor) {
    //cursor.advance(i);
    console.log("rol cursor:", cursor);
    req = store.get(cursor.key);
    req.onsuccess = function (evt) {        
    var value = evt.target.result;                
    chrome.tabs.update(cTab.id,{url:value.uri,active:true},function(t){         
        console.log(value.uri,value.path);    
        chrome.tabs.executeScript(t.id,{file:"/lib/jquery-ui-1.8.6/js/jquery-1.9.0.min.js",runAt:"document_end"},function() {
        chrome.tabs.executeScript(t.id, { code:"var jClaw = jQuery.noConflict();jClaw('html, body').animate({scrollTop:jClaw('"+value.path+"').offset().top}, 2000);jClaw('"+value.path+"').css({background:'yellow'},1000);",runAt:"document_end"},function(){ 
        chrome.tabs.sendMessage(t.id,value.path,function(response){

            cursor.continue();
        });
        });

//cursor.update(cursor.value);
    });
        //cursor.update(cursor.value);
        //chrome.tabs.sendMessage(t.id,"scrollTo");
}); 
    };

    // Move on to the next object in store
    //cursor.continue();
    //cursor.update(cursor.value);

    // This counter serves only to create distinct ids
    i++;
  } else {
    console.log("No more entries");
  }
};

Я пробовал разные способы держать транзакцию открытой. Но не смог добиться успеха.

function getObjectStore(store_name, mode) {
var tx = dbp.transaction(store_name, mode);
tx.oncomplete = function(e){
    console.log("Transaction Complete");
  };
  tx.onabort = function(e){
    console.log("Transaction Aborted");
  };
  tx.onerror = function(e){
    console.log("Transaction Error");
  };
  //tx.onsuccess=keepAlive;
return tx.objectStore(store_name);
}

Как видите, я хочу перебрать индексированную базу данных и использовать URL-адрес для заполнения страницы. Затем я хотел внедрить скрипт для извлечения текста с помощью передачи сообщений. Но если я помещу cursor.continue() вне обратного вызова, он просто перейдет к следующему URL-адресу, поскольку chrome.tabs.update является асинхронным.

Может ли кто-нибудь помочь мне здесь?


person Pradeep    schedule 23.05.2013    source источник
comment
См. также: Как вы поддерживаете транзакцию indexeddb?   -  person Myrne Stol    schedule 23.05.2013


Ответы (2)


Транзакции IndexedDB автоматически завершаются, как только ни один из прослушивателей событий не поставил в очередь одну или несколько новых операций (изменение данных или перемещение курсора). См. также: Как вы поддерживаете транзакцию indexeddb?

Чтобы выполнять асинхронные операции, использующие несколько объектов из IndexedDB, вы должны сначала собрать эти объекты в массив. Смотрите мой ответ здесь для быстрого кода. HTML5 Как узнать, когда курсор IndexedDB находится в конце . Этот код также более эффективен, поскольку он не выдает запрос на получение для каждого отдельного объекта в курсоре. В конце концов, вы можете получить прямой доступ к объекту в текущей позиции курсора, используя cursor.value.

Вы также можете посмотреть, сколько работы вы делаете для каждого объекта в вашей базе данных. В настоящее время вы каждый раз выполняете скрипт jQuery. Вероятно, вы захотите ограничить это простым вызовом chrome.tabs.sendMessage.

person Myrne Stol    schedule 23.05.2013

Я предполагаю, что chrome.tabs.update - это асинхронная функция. cursor.continue() должен вызываться немедленно, т. е. не внутри асинхронной update функции.

Другое дело, что вам не нужно store.get(cursor.key). Поскольку вы используете курсор значений, его значение можно получить с помощью cursor.value.

person Kyaw Tun    schedule 23.05.2013
comment
Спасибо за быстрый ответ! Как видите, я хочу перебрать индексированную базу данных и использовать URL-адрес для заполнения страницы. Затем я хотел внедрить скрипт для извлечения текста с помощью передачи сообщений. Но если я помещу cursor.continue() вне обратного вызова, он просто перейдет к следующему URL-адресу, поскольку chrome.tabs.update является асинхронным - person Pradeep; 23.05.2013