如何检测多个AJAX请求何时完成或失败?

时间:2011-04-21 00:46:32

标签: javascript jquery ajax

我有一个应用程序在首次运行时加载多个资源,这些资源存储在localStorage中。我有一个函数检查是否设置了所有本地存储变量,以便该部分正常工作。

我的工作方法是这样的:

  1. 显示加载消息。
  2. 初始化AJAX请求。
  3. 启动计时器间隔以检查是否所有内容都已加载。
  4. 加载数据后,初始化应用程序等。
  5. 如果数据未加载,则显示错误消息。
  6. 问题在于#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 );
    

2 个答案:

答案 0 :(得分:3)

你可以转一下吗?这样的事情(使用合理的变量名称和“真正的”API)可以简化事情:

  1. 显示加载消息。
  2. 实例化应用程序初始值设定项ai
  3. 提起AJAX请求:
    • 成功处理程序致电ai.finished(task)
    • 错误处理程序调用{​​{1}}。
    • 注册初始值设定项ai.error(task),以防“需要花费太长时间”检查。
  4. 所有AJAX请求调用ai.register(task)后,初始化应用程序等。
  5. 如果任何AJAX任务调用ai.finished,则显示错误消息并开始清理。
  6. 这样你就不需要ai.error了,而且各个AJAX任务会在完成或结束时告诉你。您可能仍希望间隔处理花费时间过长的任务,但大多数逻辑将基于通知而不是基于轮询。

答案 1 :(得分:0)

downloadData中查看您的实际ajax调用会有所帮助,但我建议您再次查看jquery AJAX API。 Ajax调用的回调不仅仅是整体完成,而是专门针对包括错误在内的成功和失败。如果出现错误,尝试执行重试等操作,如果仍然失败则可以警告用户。您还可以使用这些回调在加载完成时通知您的应用程序,而不是使用间隔计时器。