Javascript异步函数

Javascript异步函数,javascript,Javascript,我在理解如何才能/应该解决这一问题时遇到了问题 我有两个功能。在第一个函数(我称之为loadData())中,我向服务器发出异步请求以加载一些数据 在第二个函数(saveData())中,我还向服务器发送了一个asyn请求,以写入一些数据。在这个请求的回调中,我调用loadData()刷新数据 现在的问题是:在saveData()函数中,我想等待loadData()完成,然后再显示对话框(如alert('Data saved')) 我想这是一个常见的问题,但我找不到解决方案(如果有) 一个解决方

我在理解如何才能/应该解决这一问题时遇到了问题

我有两个功能。在第一个函数(我称之为
loadData()
)中,我向服务器发出异步请求以加载一些数据

在第二个函数(
saveData()
)中,我还向服务器发送了一个asyn请求,以写入一些数据。在这个请求的回调中,我调用
loadData()
刷新数据

现在的问题是:在
saveData()
函数中,我想等待
loadData()
完成,然后再显示对话框(如
alert('Data saved')

我想这是一个常见的问题,但我找不到解决方案(如果有)

一个解决方案是使请求同步,但我使用的框架不提供同步,我希望有更好的解决方案


谢谢大家

在这些情况下,技巧是嵌套“成功”回调,如下所示:

$.ajax({ 
   url: "/loadData", 
   success: function () {
      // Data Loaded... Save the data
      $.ajax({ 
         url: "/saveData", 
         success: function () {
            // Data Saved... Display alert
            alert('Data saved');
         }
      });
   }
});
function loadData() {
   .ajax({ 
      url: "/loadData", 
      success: function () {
         // Data Loaded... Process the data
      }
   });
}
function saveData() {
   loadData(function () {
       // Data Loaded (and processed by loadData())... Save the data
      .ajax({ 
         url: "/saveData", 
         success: function () {
            // Data Saved... Display alert
            alert('Data saved');
         }
      });
   });
}
如果您的
loadData()
函数如下所示:

$.ajax({ 
   url: "/loadData", 
   success: function () {
      // Data Loaded... Save the data
      $.ajax({ 
         url: "/saveData", 
         success: function () {
            // Data Saved... Display alert
            alert('Data saved');
         }
      });
   }
});
function loadData() {
   .ajax({ 
      url: "/loadData", 
      success: function () {
         // Data Loaded... Process the data
      }
   });
}
function saveData() {
   loadData(function () {
       // Data Loaded (and processed by loadData())... Save the data
      .ajax({ 
         url: "/saveData", 
         success: function () {
            // Data Saved... Display alert
            alert('Data saved');
         }
      });
   });
}
。。。然后,您可能希望给它一个回调参数,该参数在成功回调返回之前被调用:

function loadData(myCallback) {
   .ajax({ 
      url: "/loadData", 
      success: function () {
         // Data Loaded... Process the data

         // ... Your Data Processing Logic ...

         // Invoke the callback (if one was passed):
         if (typeof myCallback === 'function') {
            myCallback();
         }
      }
   });
}
然后,您就可以像这样实现
saveData()
函数:

$.ajax({ 
   url: "/loadData", 
   success: function () {
      // Data Loaded... Save the data
      $.ajax({ 
         url: "/saveData", 
         success: function () {
            // Data Saved... Display alert
            alert('Data saved');
         }
      });
   }
});
function loadData() {
   .ajax({ 
      url: "/loadData", 
      success: function () {
         // Data Loaded... Process the data
      }
   });
}
function saveData() {
   loadData(function () {
       // Data Loaded (and processed by loadData())... Save the data
      .ajax({ 
         url: "/saveData", 
         success: function () {
            // Data Saved... Display alert
            alert('Data saved');
         }
      });
   });
}

您仍然可以调用
loadData()
函数,而不必在脚本的其他部分使用任何参数。

嵌套函数是一种解决方案,但在代码质量方面是一个坏主意。您可能需要查看jquery延迟对象来解决它