2012-02-10 49 views
4

我写了下面function检查我的HTML5 openDatabase表被填充或空:返回从嵌套函数的值到它的父不使用回调

var that = this; 
that.db = openDatabase('dbname', '1.0', "description", 1024 * 1024); 

that.tableFilled = function(tableName) { 

    that.db.transaction(function (tx) { 

     tx.executeSql('SELECT * FROM ' + tableName, [], 
      function success(c, results) { 
       return (results.rows.length > 0 ? true : false); 
      }, 
      function fail() { 
       console.log('FAiL'); 
      } 
     ); 

    }); 

}; 

我想returntruefalse值到tableFilled()。其实that.tableFilled('tableName')返回undefined

我想实现在年底是:

if (that.tableFilled('tableName')){ 
    // ... 
} 

有没有一种方法可以让我returntruefalse值父功能tableFilled()不使用回调

+0

问题:为什么你不希望使用CB? Javascript提供了返回函数来编写异步代码的功能,为什么不使用它呢? – Christoph 2012-02-10 21:08:18

+2

简短回答:**没有**,因为它是异步的。我会在答案中详细阐述一下。 – Halcyon 2012-02-10 21:08:44

+0

尽管对于这种用例来说,匿名函数(对于潜在的异步调用)看起来有点毫无意义,因为除非得到答案,否则您无法进一步深究。 – twilson 2012-02-10 21:10:09

回答

5

你正在处理一个异步进程,所以你不能直接返回一个值。

可以不过是返回一个承诺。你的功能承诺当它可用时给你这个值。为了使价值超出承诺,您必须添加一个回调函数。

您仍然需要使用回调函数,但您不需要再嵌套函数,只需序列化它们即可。

这可能会超出您当前需求的范围,但这是一个非常有趣的概念。如果你想了解更多信息,只需Google即可。

下面是一个简单的例子:在回报

function my_function() { 
    var promise = new_promise(); 
    do_asynchronous(function callback(result) { 
     promise.resolve(result); // gets called after 1 second 
    }); 
    return promise; 
} 

var promise = my_function(); 
promise.done(function(result) { 
    console.log(result); // prints "yay!" after 1 second 
}); 

function new_promise() { 
    var handlers = []; 
    return { 
     "resolve": function (result) { 
      for (var i = 0; i < handlers.length; i += 1) { 
       handlers[i](result); 
      } 
     }, 
     "done": function (a_callback) { 
      handlers.push(a_callback); 
     } 
    }; 
} 

function do_asynchronous(callback) { 
    setTimeout(function() { 
     callback("yay!"); 
    }, 1000); 
}