0

我使用谷歌应用引擎来运行我的某些项目。由于它对请求施加了 30 秒的时间限制,我使用游标和内存缓存来限制数据获取过程。

问题陈述:

  1. 我有一个 ajax 调用日志,它基本上是我需要从服务器获得的所有详细信息的列表,由一些用户交互创建
  2. 调用日志中的每个 ajax 调用都可能有数据,这可能会导致 30 秒的限制达到。所以我需要把它分解并分部分归还。
  3. 完成日志中的所有调用后,我需要根据返回数据执行一些自定义逻辑。

现在,我已经有了一个以这种方式工作的解决方案:

  1. 使用一些随机标识符启动第一个 ajax 调用
  2. 返回时,检查一些参数以确定是否已获取所有必需的数据。
  3. 如果没有,则再次执行调用,使用与步骤 1 中相同的随机标识符 + 保存到目前为止已获取的任何数据
  4. 如果是,请从日志中删除该项目并为下一个项目重复步骤

但是所有这些代码当前都在 ajax 调用的成功事件中处理。我阅读了有关jQuery Deferreds的信息,它似乎是修复当前正在使用的残暴代码的一个非常好的候选者。

我已经弄清楚了以下几点:

  1. 用于$.when.apply(null, arrayOfDeferreds)创建各种动态调用列表 - 阅读jQuery.when
  2. 我现在可以使用 deferred.done 函数为每次调用保存数据转储
    问题是,我如何告诉 deferred 如果需要再次调用请求,那么不要解析 ajax 请求 - 只需保存我的数据并使用与初始调用相同的随机标识符再次执行调用?也就是说,基本上重复调用我的完成函数,直到保存所有数据?如果有更好的方法可以做到这一点,请提供解释。
4

1 回答 1

2

您可以递归地使用管道,如下所示:

function myFetch( id ) {
    return $.ajax({
        url: serviceURL,
        data: {
            id: id,
            someOthers: data
        }
    }).pipe(function( data ) {
        saveData( data );
        if ( !isOK( data ) ) {
            return myFetch( id );
        }
    });
}

ajax 请求只定义一次,您有条件地在管道处理程序中重新发出它。

于 2012-01-30T13:22:17.067 回答