0
function getNextID(number){
var maxKey = 0;
number = typeof number !== 'undefined' ? number : 1;

db.from('contributions').select('id').list().done(function(records) {

records.forEach(function(item){
    if (maxKey < item){
        maxKey = item;
    }
});

return(maxKey);

});

}

私はydn-dbを使用しています

これは、ローカル ストレージを操作するためのクラスです。AJAX ではなく非同期で動作します。

私がやろうとしているのは、テーブルの次の ID を取得することです (ただし、そのビットは実際には無関係な部分です)。

私が抱えている問題は次のいずれかです。

a)私はばかで、スコープを間違えていますmaxKey

b) 非同期呼び出しがすべてを台無しにしています。

現時点では、関数は常に「未定義」を返しますが、return をconsole.log(maxKey);それに置き換えると正常に動作します。

この関数を正しく呼び出せるように修正する方法を誰か教えてもらえますか?

(これは関数の例なので、次のキーを見つけるための組み込み関数は高く評価されますが、関数内から非同期アイテムを返す方法を本当に知る必要があります!)

それが明確であることを願っています-質問があれば-発砲してください!

4

2 に答える 2

2
function getNextID(number,callback){
var maxKey = 0;
number = typeof number !== 'undefined' ? number : 1;

db.from('contributions').select('id').list().done(function(records) {

records.forEach(function(item){
    if (maxKey < item){
        maxKey = item;
    }
});

callback(maxKey);

});

}

次に、コードで

getNextID(number,function(maxKey){
   // continue the code here.
});

あなたのコードは非同期であるため、getNextID から何も返すことはできませんが、プロミスを返すか、継続 (コールバック) を使用します。

于 2014-03-19T17:10:22.280 に答える
1

主キーはソートされているため、最初のキーを取得するだけで最大のキーを取得できます。

function getNextID(number,callback){

var key_range = number ? ydn.db.KeyRange.lowerBound(number, true) : null;

var reverse = true; // sort by descending order
var iter = new ydn.db.KeyIterator('contributions', key_range, reverse);

db.get(iter).done(function(maxKey) {

  callback(maxKey);

});

}
于 2014-03-20T02:49:26.137 に答える