2016-07-13 24 views
1

Ich habe Variable zwischen JavaScript-Funktion, die asynchron ist. Einer von ihnen ist Hauptfaden und ein anderer ist ereignisbasiert. Ich möchte den Wert zurückgeben, wenn das Ereignis abgeschlossen ist.Abrufen von Daten aus indexedDB und Rückgabewert zum Funktionsaufruf

Dies ist der Code:

completeExecution = false; // Shared Variable (Global Variable) 
indexDBdata = {};    // Shared Variable (Global Variable) 

function getPermission(key) { 
    var permission_data={}; 

    if(exist_in_local) { 
     indexdbConnection.getRecordByKey('userPermission',permitKey,function(data){ 
     indexDBdata=data; // Before its complete function return value 
    }); 
    } else { 
     // make ajax call & its working fine 
    } 
    return permission_data; 
} 

// Daten von IndexedDB

bekommen
getRecordByKey:function(tableName,key,readRecords){ 
    if(isEmptyOrNull(readRecords)){ 
     console.log("callback function should not be empty"); 
     return; 
    } 

    if(isEmptyOrNull(tableName)){ 
     console.log("table name should not be empty"); 
     return; 
    } 

    var returnObj={}; 
    var isSuccessfull=false; 

    if(this.dbObject.objectStoreNames.contains(tableName)){ 
     var transaction=this.dbObject.transaction(tableName); 
     var objectStore = transaction.objectStore(tableName); 
     objectStore.get(key).onsuccess = function(event) { 
      returnObj=event.target.result; 
     }; 

     **//Return object after this events compelte** 
     transaction.oncomplete = function(evt) { 
      completeExecution=true; 
      indexDBdata=returnObj; 
      readRecords(returnObj); 

     }; 

     transaction.onerror = function(evt) { 
      completeExecution=true; 
      indexDBdata={status:'404'}; 
      readRecords("Table Not found"); 
     }; 
    } else { 
     completeExecution=true; 
     indexDBdata={status:'404'}; 
     readRecords("Table Not found"); 
    } 

} 

Problem ist, während Daten von IndexedDB Abrufen es gibt immer {} (leeres Objekt). Ich möchte den Ereignis-Thread und den Haupt-Thread synchronisieren oder auf den Abschluss des Ereignisses warten. Ich möchte DOM bei Callbacks nicht direkt manipulieren, ich muss Wert zurückgeben.

Wenn Sie eine Lösung für das obige Problem oder einen anderen Trick haben, dann bitte helfen Sie mir.

Vielen Dank im Voraus.

+0

'zwischen Javascript threads' ..., was Sie tun bedeuten? JavaScript ist nicht multi-threaded. –

Antwort

0

Ich finde die Frage nicht sehr klar, aber wenn ich es verstehe, dann müssen Sie mehr über das Schreiben von asynchronem Javascript lernen. Im Allgemeinen sind Funktionen, die Callback-Funktionen aufrufen, ungültig (sie geben einen undefinierten Wert zurück). Wenn Sie die Ergebnisse von zwei Callback-Funktionen zusammen verwenden möchten, möchten Sie sie so verketten, dass die Callback-Funktion nach Abschluss der ersten Funktion, die ihre Callback-Funktion aufruft, die zweite Funktion aufruft, die dann den zweiten Callback aufruft . Es sind also vier Funktionsaufrufe beteiligt. Sie möchten die Verarbeitungslogik im Kontext der sukzessiven Callback-Funktion platzieren, anstatt die Logik außerhalb der Funktion fortzusetzen und den Rückgabewert zu verwenden.

Mit anderen Worten, anstatt zu versuchen, dies zu tun:

function a() {} 
function b() {} 
var aresult = a(); 
var bresult = b(aresult); 
// processing of both a and b 

Sie wollen würde, etwas zu versuchen und zu tun wie folgt vor:

function a(acallback) { 
    acallback(...); 
} 
function b(bcallback) { 
    bcallback(...); 
} 

a(function(...) { 
    b(function(...) { 
    // all processing of both a and b 
    }); 
});