【问题标题】:New to asynchronous programming in JavaScript. Any advice?JavaScript 中的异步编程新手。有什么建议吗?
【发布时间】:2011-06-28 17:11:51
【问题描述】:

异步回调很棒,但是当一个回调依赖于另一个回调的结果时,我会使用带有回调的 api 调用进行回调,依此类推。

apiCall(function () { apiCall(function () { apiCall(function () ...

我可以命名回调函数而不是内联它们。这看起来更漂亮,嵌套更少,但我觉得它更容易阅读。

这是一个例子。我需要查询本地sqlite数据库,使用结果查询服务器,然后使用响应更新本地数据库。

function sync() {
  db.transaction(
function (transaction) {
  execute(transaction, 'SELECT max(server_time) AS server_time FROM syncs;', [],
      function (transaction, results) { // Query results callback
        var t = results.rows.item(0).server_time;
        $.post('sync.json', { last_sync_time: (t || '1980-01-01') },
           function (data) { // Ajax callback
             db.transaction(
               function(transaction) {
                 $(data.thing).each(function () {
                              var thing = new Thing(this.thing);
                              thing.insert(transaction);
                            });
               });
           });
      });
});
}

有没有办法解决这个问题(除了命名回调)?

【问题讨论】:

    标签: javascript sqlite browser asynchronous


    【解决方案1】:

    我认为通过命名函数而不是内联编写它们来丢弃未嵌套的东西太快了。这几乎是收拾烂摊子的唯一方法。

    代替:

    do_a(
      function () {
        // more nesting...
      }
    );
    

    使用名称为每个功能提供一些清晰性和用途:

    function on_a_complete() {
    
    }
    
    do_a(on_a_complete);
    

    【讨论】:

      【解决方案2】:

      我想你回答了你自己的问题。命名你的回调实际上是清理它的唯一方法。比如:

      execute(transaction, 'SELECT max(server_time) AS server_time FROM syncs;', [],handleLocalResults, errorHandler);
      
      handleLocalResults = function (transaction, results)...
      
      handleServerResults = func... 
      

      【讨论】:

        【解决方案3】:

        命名回调是您可以做的一件事,但您需要做的另一件事是拥有不重叠的 SQL 事务。 (1)

        你的第一笔交易应该是这样的:

        // The whole thing starts here
        db.transaction(selectTimeCB, null, ajaxPost);
        

        事务开始时回调选择时间,当事务完成后,调用ajaxPost操作。

        // Initial transaction to get server_time
        var selectTimeCB = function(t) {
          var query = 'SELECT max(server_time) AS server_time FROM syncs';
          t.executeSql(query, [], postLastSyncCB);
        };
        
        // This saves the results from the above select, and nothing else.
        var server_time;
        var postLastSyncCB = function(t, results) {
          server_time = results.rows.item(0).server_time;
        };
        
        var ajaxPost = function() {
          $.post('sync.json', { last_sync_time: (server_time || '1980-01-01') }, nextDbTransaction);
        };
        

        如果你有重叠的 SQL 事务,那真的会影响数据库的性能。我最近在一个超过 500 行的数据库上对 200 个混合事务进行了测试,发现保持事务分开将超过 90 秒的运行时间减少到 3-5 秒。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-13
          • 2011-05-10
          • 2013-04-26
          相关资源
          最近更新 更多