2017-09-07 10 views
1

まず、この質問には適切なタイトルが見つかりません。自由に編集してください。約束事としてのIndexDBカーソル.onsucess

私は例えば、単純な関数呼び出し、この関数を呼び出すとき今

loadNeededParcels = property => { 
    const dbResults = []; 
    var readTransaction = this.db 
     .transaction("parcelData") 
     .objectStore("parcelData"); 
    readTransaction.openCursor().onerror = e => { 
     console.log("open cursor error ", e); 
    }; 
    readTransaction.openCursor().onsuccess = e => { 
     const cursor = e.target.result; 
     if (cursor) { 
     dbResults.push(cursor.value); 
     cursor.continue(); 
     } else { 
     return dbResults; 
     } 
    }; 
    }; 

、indexDbからオブジェクトを読み込み、以下の機能を持っている:

console.log(loadNeededParcels('hasData')) 

コンソールログがundefinedです。関数がカーソルが終了し、変数dbResultsを返すのを待たないので、これが起こっていると思いますか?

私の質問はこれです - どうすればこの機能を約束するか、あるいはreadTransaction.openCursor().onsucessがトリガーするのを待つことができますか?

したがって、関数が終了する前にデータベースから読み取った値を実際に返すことが期待されます。

IEで.getAll()メソッドがサポートされていないため、カーソルを使用しています。

答えて

0

このような何かを試してみてください。 2つの要求を作成するopenCursorを2回も呼び出さないでください。

function loadNeededParcels(db, property) { 
return new Promise(function(resolve, reject) { 
    var results = []; 
    var tx = db.transaction('parcelData'); 
    tx.onerror = function(event) { 
    reject(tx.error); 
    }; 
    var store = tx.objectStore('parcelData'); 

    // Open a cursor over all items 
    var request = store.openCursor(); 

    request.onsuccess = function(event) { 
    var cursor = request.result; 
    if(cursor) { 
     var value = cursor.value; 
     if(value) { 
     // Only append defined values to the array 
     results.push(cursor.value); 
     } 

     cursor.continue(); 
    } else { 
     resolve(results); 
    } 
    }; 
}); 
} 

loadNeededParcels(db, 'hasData').then(function(results) { 
    console.log('Results', results); 
}).catch(function(error) { 
    console.error(error); 
}); 
+0

ここではプロパティをopenCursorの引数として渡しますが、プロパティはキーではないので動作しません。また、プロパティの後の疑問符は何を表していますか?しかし、ええ、あなたのアプローチを使用してメソッドを書き直したのはopenCursorを1回だけ使うことで、これは以前より少し速くなっています –

+0

擬似コードです。あなたのコードが何をしようとしているのか分かりません。疑問符はそれを示すはずだった。範囲または値パラメータなしでカーソルを開くと、ストア内のすべてのオブジェクトを反復処理していることを意味します。 – Josh

+0

基本的には、データベースからすべてのレコードを取得し、渡されたプロパティが未定義のレコードのみを返します(つまり、parcel [property] ===未定義の場合) –

0

私が使用して終了シンプルなソリューション:

loadNeededParcels = property => { 
    return new Promise((resolve, reject) => { 
     var readTransaction = this.db 
     .transaction("parcelData") 
     .objectStore("parcelData"); 
     readTransaction.openCursor().onerror = e => { 
     reject(e); 
     }; 
     const dbResults = []; 
     readTransaction.openCursor().onsuccess = e => { 
     const cursor = e.target.result; 
     if (cursor) { 
      dbResults.push(cursor.value); 
      cursor.continue(); 
     } else { 
      resolve(dbResults); 
     } 
     }; 
    }); 
    }; 
+0

'.onerror = e => { reject(e); }; '単純に' .onerror = reject; ' – estus

関連する問題