javascript - JavaScript 异步编程的新手。有什么建议吗?

标签 javascript sqlite browser asynchronous

异步回调很棒,但是当一个回调依赖于另一个回调的结果时,我会使用具有回调的 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);
                            });
               });
           });
      });
});
}

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

最佳答案

我认为您通过命名您的函数而不是内联编写它们来丢弃未嵌套的东西太快了。这几乎是清理困惑的唯一方法。

代替:

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

使用名称为每个函数提供一些清晰度和用途:

function on_a_complete() {

}

do_a(on_a_complete);

关于javascript - JavaScript 异步编程的新手。有什么建议吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5022883/

相关文章:

javascript - 使用JS相对于后端使用按钮保存草稿有什么优势?

javascript - jquerytoggle() 不适用于变量

c# - .net core 1.0.0 与 Entity Framework 核心 sqlite

html - 模拟高分辨率显示来测试网页

css - HTML 显示原始文本

javascript - Angular $http.get : How to catch all the errors?

javascript - 如何取消订阅除当前用户和发布者之外的所有用户的视频

python - 为什么 python 的 sqlite3 模块试图从我的项目目录中导入日期时间?

android - 使用我自己的 SQLite 数据库

javascript - 我在历史记录列表中的什么位置?