2016-07-13 24 views
1

私は非同期のjavascript関数の間で変数を共有しています。それらのうちの1つはメインスレッドであり、もう1つはイベントベースです。私はイベントが完了したときに値を返したい。indexedDBからデータを取得し、関数呼び出しに戻り値

これはコードです:のIndexedDBからデータを取得しながら、

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; 
} 

//のIndexedDB

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"); 
    } 

} 

からデータを取得問題は、それが常に{}(空のオブジェクト)を返します。イベントスレッドとメインスレッドを同期させたい、またはイベントが完了するのを待っています。私は値を返さなければならないコールバックでDOMを直接操作したくない。

上記の問題または他のトリックの解決策がある場合は、私を助けてください。

ありがとうございます。

+0

'...あなたが何を代わりにこれをやろうとしているのつまり

、平均? JavaScriptはマルチスレッドではありません。 –

答えて

0

私は質問が非常にはっきりしていませんが、私が理解していれば、非同期JavaScriptの作成についてもっと学ぶ必要があります。一般に、コールバック関数を呼び出す関数はvoidです(未定義の値を返します)。 2つのコールバック関数の結果を一緒に使用したい場合は、最初の関数(コールバック関数を呼び出す)が完了すると、コールバック関数が2番目の関数を呼び出して2番目のコールバック。したがって、4つの関数呼び出しがあります。関数の外部でロジックを継続し、その戻り値を使用するのではなく、連続したコールバック関数のコンテキスト内に処理ロジックを配置することをお勧めします。あなたは、次のようなものを試してみて、したいと思う

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

:threads` javascriptの間

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

a(function(...) { 
    b(function(...) { 
    // all processing of both a and b 
    }); 
}); 
関連する問題