WEB开发网
开发学院网页设计JavaScript 写个 JavaScript 异步调用框架 (Part 6 - 实例 &a... 阅读

写个 JavaScript 异步调用框架 (Part 6 - 实例 & 模式)

 2010-09-14 13:47:36 来源:WEB开发网   
核心提示: 在这里,我们假设friendlist接口返回的JSON就是一个Array,写个 JavaScript 异步调用框架 (Part 6 - 实例 & 模式)(3),在获取到这个Array后构造一个等长的异步调用队列,其中每一个调用的逻辑都是一样的——取出Arra

在这里,我们假设friendlist接口返回的JSON就是一个Array,在获取到这个Array后构造一个等长的异步调用队列,其中每一个调用的逻辑都是一样的——取出Array中首个好友的名称,用get方法获取对应的好友对象,再将好友对象放入另一个Array中。在调用队列的末端,我们再追加了一个调用,用于返回保存好友对象的Array。

在这个例子当中,我们没有利用调用队列会把上一个函数的结果传递给下一个函数的特性,不过也足够展示调用队列的用途了——让多个底层为Ajax请求的异步操作按照固定的顺序阻塞式执行。

由于底层异步函数返回的就是Async.Operation,你可以直接把它传递给next方法,也可以用匿名函数包装后传递给next方法,而匿名函数内部只需要一个return。

延时函数

在上面的例子中,使用队列是为了避免触发服务器的防攻击策略,但有时候这还是不够的。例如说,服务器要求两个请求之间至少间隔500毫秒,否则就认为是攻击,那么我们就要在队列里面插入这个间隔了。

在原本next方法调用的匿名函数中手动加入setTimeout是一个办法,但为什么我们不写一个辅助函数来解决这类问题呢?让我们来写一个辅助方法并让它和Async.Operation无缝结合起来。

Async.wait = function(delay, context) {
  var operation = new Async.Operation();
  setTimeout(function() { operation.yield(context); }, delay);
  return operation;
};

Async.Operation.prototype.wait = function(delay, context) {
  this.next(function(context) { return Async.wait(delay, context); });
}

在有了这个辅助方法后,我们就可以在上述getAll方法中轻松实现在每个Ajax请求之间间隔500毫秒。在for循环内的加上对wait的调用就可以了。

for (var i = 0; i < json.length; i++) {
  chain
    .wait(500)
    .next(function() {
      return get(json.shift())
        .addCallback(function(friend) { friends.push(friend); });
  });
}

小结

通过一些简单的例子,我们了解到了Async.Operation常见的使用方式,以及在有需要的时候如何扩展它的功能。希望Async.Operation能够有效帮助大家提高Ajax应用的代码可读性。

上一页  1 2 3 

Tags:JavaScript 异步 调用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接