【问题标题】:asynchronous database calls making function not work异步数据库调用使功能不起作用
【发布时间】:2014-03-19 17:06:12
【问题描述】:
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) 异步调用搞砸了一切。

目前该函数总是返回 'undefined' - 但是如果我将 return 替换为 console.log(maxKey); 它工作正常。

谁能告诉我如何修复这个函数以便正确调用它?

(这是一个示例函数,因此尽管任何用于查找下一个键的内置函数都会受到赞赏,但我真的需要知道如何从函数中返回异步项!)

我希望这很清楚 - 任何问题 - 开火!

【问题讨论】:

  • 请阅读How to return the response from an AJAX call?。问题是 b,你必须从 getNextID 返回一个承诺。
  • 嗨 Felix - 它不是 AJAX,它是本地存储 - 为了清楚起见,我会修改我的问题!
  • 没关系。异步是异步和回调,promise 是每个异步函数的解决方案。
  • 谢谢菲利克斯 - 你是对的,我只是没有明白你想要表达的意思!
  • 是的,从标题中看不出这是适用于所有异步情况的解决方案。我考虑更改问题/答案以使其更通用,但还没有找到时间。

标签: javascript asynchronous ydn-db


【解决方案1】:
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 返回任何内容,只能返回承诺或使用延续(回调)。

【讨论】:

  • 谢谢!我真是个白痴——这个承诺总是让我抓狂!带有回调的函数的回调显然对我的 ickle 大脑来说太多了!还不能接受,但我可以接受。
【解决方案2】:

由于主键是排序的,所以只要取第一个就可以得到最大的键:

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

});

}

【讨论】:

  • 感谢 kyaw tun - 您的库(是您的库还是您参与其中,对吗?)很棒,尽管我可能会蛮力地强制执行很多内置的功能,因为我有点菜鸟并且从未使用过索引数据库等,所以我从头开始学习所有这些!
猜你喜欢
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多