我有一个函数(searchTerm),它应该同时从两个URL获取数据,并在两个调用完成后显示结果。
当我只使用.when
中的一个参数(比如$.ajax(options1)
)调用时,此功能正常,
但由于我需要两个并行的输出,我在.then
函数中调用URL并记录响应data1和data2,但现在在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:
我作为options1和options2的一部分提到的url指向同一个控制器中的动作方法,它们都返回等待的(ActionResult)对象任务。这可能是问题吗?呼叫是否以某种方式阻止/中断异步请求?
信息3:
试图提供更多细节。行动方法的定义是这样的 -
public async Task<ActionResult> someurl1(.....){
...
...
return await View(...);
}
答案 0 :(得分:0)
最后,我通过所有后续调用找到了答案。我从两个动作方法调用一个公共函数,它使用全局变量进行外部URL调用。只需使用以下锁定机制即可使我的关键部分成为线程安全的。
public static object Lock = new object();
lock (Lock) // added for thread safety purpose
{
response_task = CallExtern(...)
}
答案 1 :(得分:-1)
尝试添加选项
async: false
到ajax对象。