【问题标题】:Extjs: two parallel ajax callExtjs:两个并行的ajax调用
【发布时间】:2011-05-28 15:21:03
【问题描述】:

我的代码同时创建两个 ajax 调用(我假设并行性会更有效)。如果两个调用都成功,我想加载一个表。这样做的正确方法是什么?

【问题讨论】:

  • 不过,将两个请求合二为一并在服务器端多线程运行它们(如果这样的话)应该会更有效。

标签: javascript ajax extjs


【解决方案1】:
var succeeded = {};

function callBackOne(){
     succeeded.one = true;
     // your other stuff
     if (succeeded.two) { bothHaveSucceeded());
}


function callBackTwo(){
     succeeded.two = true;
     // your other stuff
     if (succeeded.one) { bothHaveSucceeded());
}

【讨论】:

  • 请注意,这在具有多个线程的 Java 中不起作用(您需要添加同步以避免竞争条件),但由于 JavaScript 没有多个线程(至少不在同一个文档中),它应该可靠地工作。
【解决方案2】:

我个人会使用延迟任务:

var success = {
  one: false,
  two: false
};

// Task
var task = new Ext.util.DelayedTask(function(){
   // Check for success
   if (success.one && success.two) {
      // Callback
      doCallback();
   } else {
      task.delay(500);
   }
});
task.delay(500);

// First
Ext.Ajax.request({
   ...
   success: function() {
      success.one = true;
   }
   ...
});

// Second
Ext.Ajax.request({
   ...
   success: function() {
      success.two = true;
   }
   ...
});

任务acts 就像一个线程,每 500 毫秒检查一次请求和sleep 的状态,直到它们都完成。

【讨论】:

  • 我不会用计时器来做这个。您将检查 ajax 调用是否已不必要地完成,并且您可能在 ajax 调用完成后仍有时间等待。
【解决方案3】:

老问题,但是,我偶然发现它......

我会使用 Caolan 出色的 async 库,尤其是在这里你会想要使用 async.parallel。

GitHub 文档上的示例值得一读。

https://github.com/caolan/async#parallel

【讨论】:

    【解决方案4】:

    共享每个回调检查的整数变量:

    // count variable
    var numReturns = 0;
    
    // same call back used for each Ajax request:
    function callback() {
        numReturns++;
        if (numReturns === 2) {
            progress();
        }
    }
    

    如果您需要不同的回调,请让每个回调触发一个执行相同操作的事件。

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-10
      • 2013-05-25
      • 1970-01-01
      • 2017-05-09
      • 2012-09-23
      相关资源
      最近更新 更多