Callback, return value and HTML5 executeSql function

前端 未结 4 1412
轻奢々
轻奢々 2020-12-18 08:19

I have a big problem. I know it\'s about callback, closure but I don\'t know how to solve the problem. Here is my code

$.Model.extend(\'Article\',
{
     fin         


        
相关标签:
4条回答
  • 2020-12-18 08:47

    The W3C web database spec talks about support for both Asynchronous and Synchronous database operations. (See 4.3 and 4.4)

    If you can't use a synchronous implementation, then you might want to consider approaching the problem like this instead:

    $.Model.extend('Article',
    {
         findAll : function(params, success, error){                
                    var result = []
                    db.transaction(function(tx) {
                        tx.executeSql('select * from contents', [],function(tx, rs) {
                            for(var i=0; i<rs.rows.length; i++) {
                                var row = rs.rows.item(i)
                                result[i] = {
                                    id: row['id'],
                                    title: row['title'],
                                    body: row['body']
                                }
                            }
    
                            success(result); //toss the result into the 'success' callback
                        })
                    })
                    //here result is undefined
                    alert(result)
                    return result
        }
    })
    
    Article.findAll([], function(view) {
            //...
        }, function() {
            //error occured
        });
    
    0 讨论(0)
  • 2020-12-18 08:49

    Your trying to use the result synchronously, that is your accessing result before its defined (actually in your code example its not undefined, its an empty array) though I expect thats because you had moved the declaration from its original position trying to figure out what was happening.

    Try this modified example:-

    $.Model.extend('Article',
    {
        findAll : function(params, success, error){                
                db.transaction(function(tx) {
                    tx.executeSql('select * from contents', [], function(tx, rs) {
                        var result = [];
                        for(var i=0; i<rs.rows.length; i++) {
                            var row = rs.rows.item(i)
                            result.push({
                                id: row['id'],
                                title: row['title'],
                                body: row['body']
                            });
                        }
                        success(result);
                    });
                });
        }
    });
    
    Article.findAll({}, function(result) { 
        // process result here
    });
    

    Article.findAll() is now an asynchronous function, and its callback (closure) receives the results.

    0 讨论(0)
  • 2020-12-18 09:09

    I had the same problem, especially on mobile development projects. I created a library that eliminates the need for callbacks: http://code.google.com/p/proto-q/

    This made my code easier to troubleshoot, maintain, and enhance.

    I added support for AJAX, web workers, script injection, and the storage APIs. I hope it helps.

    0 讨论(0)
  • 2020-12-18 09:14

    I have the same issues, but you might want to use this little wrapper library that makes life easier ;)

    http://github.com/grosser/arjs

    0 讨论(0)
提交回复
热议问题