【问题标题】:Get a value from database using jQuery promises and use it anywhere使用 jQuery Promise 从数据库中获取一个值并在任何地方使用它
【发布时间】:2016-05-02 02:36:04
【问题描述】:

我正在使用 jQuery 承诺从 web SQL 数据库表中返回数据集并使用$.when,我可以根据此链接返回数据集并在$.when 中使用它

Return multiple rows as an array from a WebSQL databse using javaScript

但是我如何在$.when 之外使用该数据集?

这里是查询的来源:

function getContacts(){
    var defer = $.Deferred();       
    db.transaction(function(tx) {
        tx.executeSql('SELECT * FROM contacts', [], function(tx, results) {
           defer.resolve(results.rows);
        },function(tx, err){
            alert("An internal error occurred. " + err.message);
        });
    });
    return defer.promise();
}

这是在$.when 中返回和使用该值的来源:

var contact = getContacts();
$.when(contact).done(function(cont) {
    for(var i = 0; i < cont.length; i++){
        // can use the 'cont' variable to access data in the table 
        // inside this '$.when', but can't use it outside this $.when block
    }
});

我怎样才能做到这一点?

【问题讨论】:

  • 您不能真正在$.when().done() 回调之外使用它,因为这是您唯一可靠地知道它存在的地方。在其他任何地方,对于值何时准备就绪,时间是完全未知的。如果需要,您可以从其中调用任何其他函数并将数据传递给它,但这是您必须使用异步响应的方式。
  • 我无法将数据集传递给 $.when().done() 内部的变量并在外部调用它。我可以吗?
  • 对不起,我不明白你最后的评论是什么意思。理解 Promise 和异步编码的一个重要部分是 .done() 处理程序在将来的某个时间被调用,而你真的不知道它什么时候会被调用。因此,您可以将结果存入 .done() 处理程序中的其他外部变量中,但您的其他代码不会等待数据存在,除非它本身是从 .done() 处理程序中调用的。
  • 如果我使用变量来分配 $.when().done() 内部的数据并在外部使用它,我可以这样做吗?
  • 否 - 不可靠。看来您只是不了解异步计时的问题。阅读关于 ajax 调用的 this answer 可能会有所帮助,但存在相同的异步问题。

标签: javascript jquery promise web-sql


【解决方案1】:

你应该修改你的结果,让它只返回数据。

function getContacts(){
    var defer = $.Deferred();       
    db.transaction(function(tx) {
        tx.executeSql('SELECT * FROM contacts', [], function(tx, results) {
           var data = [];
           if (results.rows.length > 0) {
               for (var i = 0; i < results.rows.length; i++) {
                   data.push(results.rows.item(i));
               }
           }
           defer.resolve(data);
        },function(tx, err){
            alert("An internal error occurred. " + err.message);
        });
    });
    return defer.promise();
}

要访问您的数据,试试这个。

var fetchContacts = getContacts();
var contacts = [];
$.when(fetchContacts).then(function (cont) {
    contacts = cont;
}).done(function () {
    // contacts is now not empty
});

参考我的示例 http://jsfiddle.net/xalvin11/6htanxhs/

【讨论】:

  • 无意冒犯 Alvin Magalona。我有结果,问题是我无法在 $.when 之外得到结果。
  • 对 jquery deferred 使用 then() 和 done() 功能。我更新了我的示例代码。
  • 使用“then”也不能解决问题。
猜你喜欢
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2020-11-03
相关资源
最近更新 更多