【问题标题】:Unable to retrieve data from parallel ajax calls无法从并行 ajax 调用中检索数据
【发布时间】:2014-09-03 19:58:00
【问题描述】:

我在下面有一个函数(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(...);
}

【问题讨论】:

  • 你可以试试 .done 代替 .then 看看它是否有效?
  • 我试过了,但没有任何影响。
  • 你检查了网络选项卡是否两个请求都返回成功?
  • 我现在检查了一下,似乎第一次调用 ($.ajax(options1)) 正在返回 500 Internal Server Error,但我不知道为什么。为什么这个调用独立工作但在为 .when 指定另一个参数之后却不能正常工作?你能建议可能是什么原因吗?我也在从我这边检查。
  • jsfiddle.net/cnckfzpy 一切正常。分别检查 urls 和 ajax 响应。由于您没有错误状态处理,因此两个调用都必须成功。

标签: javascript jquery ajax


【解决方案1】:

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

public static object Lock = new object();

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

【讨论】:

    【解决方案2】:

    尝试添加选项

    async: false
    

    到 ajax 对象。

    【讨论】:

    • async: false 不适用于 Promise 对象。 (并且通常在几乎所有情况下都是一个坏主意。)
    • 另外,我确实希望同时处理两个请求,所以 async: false 不是一个选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2016-08-16
    • 1970-01-01
    • 2012-01-04
    • 2019-04-04
    • 2019-12-16
    • 2015-07-18
    相关资源
    最近更新 更多