2010-06-10 149 views
3

我有一个理解如何解决这个问题的问题。Javascript异步函数

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

在第二个函数(saveData())中,我也在向服务器发出asyn请求来写入一些数据。在这个请求的回调中,我打电话给loadData()刷新数据。

现在的问题:在saveData()功能我想等loadData()要完蛋之前,我展示一个对话框(如alert('Data saved')

我想这是一个常见的问题,但我无法找到解决办法它(如果有的话..)

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

谢谢给所有人!

回答

10

在这些情况下,关键是要鸟巢“成功”回调是这样的:

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

如果您loadData()功能看起来是这样的:

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

...那么你可能想给它一个回调参数,在成功回调返回之前被调用:

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()功能:

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()功能,而无需在脚本的其他部分的参数。

+0

这是一个好主意,谢谢! – Ben 2010-06-10 11:34:48

1

嵌套函数是一种解决方案,但在代码质量方面却不是个好主意。你可能想看看jQuery的推迟对象来解决它。

Deferred documentation