Extjs:两个并行的Ajax调用

4

我的代码同时创建了两个ajax调用(我认为并行处理会更有效率)。如果两个调用都成功,我想要加载一个表格。这该如何正确地实现呢?


2
将这两个请求合并成一个,并在服务器端进行多线程处理(如果有意义的话)应该更加高效。 - Thilo
4个回答

5
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());
}

1
请注意,这段代码在Java中无法使用多线程(您需要添加同步以避免竞态条件),但由于JavaScript没有多线程(至少不在同一文档中),因此它应该可以可靠地工作。 - Thilo

1

我个人会使用延迟任务:

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;
   }
   ...
});

任务的作用类似于一个线程,它将检查请求的状态,并且每500毫秒休眠一次,直到它们都完成。


3
我不会用定时器来做这件事情。这样做会导致你不必要地检查ajax调用是否已完成,而且可能会在ajax调用完成后仍然等待一段时间。 - Miles

1

虽然这是一个老问题,但是我碰巧遇到了...

我会使用Caolan的出色的async库,特别是在这里,你需要使用async.parallel

Github文档中的示例值得一读。

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


0
分享一个整数变量,每个回调函数都会检查:
// count variable
var numReturns = 0;

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接