2011-04-21 217 views
1

我有一个应用程序在第一次运行时加载多个资源,这些资源存储在localStorage中。我有一个函数,检查是否所有的本地存储变量设置,以便该部分工作正常。如何检测几个AJAX请求已完成或失败?

我的工作的方法是这样的:

  1. 显示加载消息。
  2. 初始化AJAX请求。
  3. 启动计时器间隔以检查是否所有内容都已加载。
  4. 当数据加载时,初始化应用程序等。
  5. 如果数据未加载,则显示错误消息。

问题是#5 - 如何检测是否有错误?例如,如果出现连接问题或服务器因任何原因而发回无效数据。这里是我当前的代码 - downloadData只是进行基本的AJAX请求:

// check local storage and download if any missing 
if (!checkLocalStorage()) 
{ 
    $('#content').before('<div class="notice" id="downloading">Downloading data, please wait...</div>'); 
    for (var i in db_tables) 
    { 
     if (localStorage[db_tables[i]] == null) 
      downloadData(db_tables[i]); 
    }  
} 

// check progress 
var timer = setInterval(function() { 
    if (checkLocalStorage()) 
    { 
     // everything is downloaded 
     $('#downloading').hide(); 
     clearInterval(timer); 
     initApp(); 
    } 
}, 500); 

回答

3

你可以把它转一下吗?类似这样的(具有明智的变量名称和“真实的”API)将简化以下内容:

  1. 显示加载消息。
  2. 实例化应用程序初始化程序ai
  3. 抬起AJAX请求:
    • 成功处理程序调用ai.finished(task)
    • 错误处理程序调用ai.error(task)
    • 注册初始化程序ai.register(task),以防止“您需要太长时间”检查。
  4. 一旦所有的AJAX请求都要求ai.finished,初始化应用程序等
  5. 如果有任何的所谓ai.error AJAX的任务,则显示错误消息,并开始清理东西。

这样你就不需要setInterval(),单个的AJAX任务会告诉你他们什么时候完成或者摔倒了。您可能仍然希望间隔处理耗时过长的任务,但大多数逻辑将基于通知而不是基于轮询。

0

眼看downloadData实际Ajax调用会有所帮助,但我建议你看看在jquery AJAX API一次。 Ajax调用的回调不仅仅是为了全面完成,特别是对于包括错误在内的成功和失败。尝试执行重试操作,如果出现错误,并且如果继续失败,则可以警告用户。您也可以使用这些回调来在加载完成时通知您的应用程序,而不是使用间隔计时器。

+0

问题是,服务器可能会返回200响应,但数据不正确(例如PHP/MySQL错误或其他)。 – DisgruntledGoat 2011-04-21 09:27:16