2014-09-03 101 views
2

我有一个函数(searchTerm),它应该从两个URL中同时获取数据,并在两个调用完成后显示结果。无法从并行ajax调用中检索数据

这是工作正常,当我在.when只有一个参数调用(比如$.ajax(options1)),

但我需要从两个并行输出,我在.then调用这两个网址,并记录响应数据1和数据2函数,但现在在ajax调用完成后它不会被调用。

任何人都可以告诉我在这种方法中是否正确吗?如果是这样,那么为什么回调没有得到执行?

var searchTerm = function() { 

    var $a = $(this); 
    var term = $("#searchbox").val(); 

    var options1 = { 
     url: "someurl1", 
     contentType: "application/json", 
     data: JSON.stringify({ 
      searchString: term 
     }), 
     type: "post", 
     dataType: "html" 
    }; 

    var options2 = { 
     url: "someurl2", 
     contentType: "application/json", 
     data: JSON.stringify({ 
      searchString: term 
     }), 
     type: "post", 
     dataType: "html" 
    }; 

    $.when($.ajax(options1), $.ajax(options2)).then(function(data1, data2) { 
     alert("callbacks finished"); 
    }); 

信息1:
               似乎任何Ajax调用我指定为第一个参数与500服务器错误而失败。我尝试交换options1和options2,现在使用options2的调用失败。

信息2:
               我所提到的选项1和选项2点在同一个控制器中的操作的方法和一部分的URL,他们都返回(的ActionResult)对象的awaitable任务。这可能是这里的问题吗?这些调用是通过异步请求以某种方式阻止/中断对方的?

信息3:
               试图提供更多的细节的工作。的动作方法的定义是这样的 -

public async Task<ActionResult> someurl1(.....){ 
... 
... 
return await View(...); 
} 
+0

可以尝试.done而不是.then,看看它是否工作? – Sunand 2014-09-03 20:02:38

+0

我确实尝试过,但没有任何影响。 – Sam 2014-09-03 20:04:48

+3

你检查网络标签是否都是返回成功的请求? – Sunand 2014-09-03 20:08:38

回答

0

最后,我在调试完所有后续调用后找到答案。我从两个使用全局变量进行外部URL调用的操作方法调用了一个通用函数。只需使用下面的锁定机制,使我的关键部分线程安全。

public static object Lock = new object(); 

lock (Lock) // added for thread safety purpose 
{ 
    response_task = CallExtern(...) 
} 
-1

尝试添加选项

async: false 

到AJAX对象。

+1

async:false不适用于承诺对象。 (并且在几乎所有情况下通常都是一个坏主意)。 – 2014-09-03 22:01:25

+0

另外,我确实希望同时处理这两个请求,所以async:false不是一个选项。 – Sam 2014-09-03 22:35:25