AJAX请求不使用$ .when(...)并行执行

时间:2016-07-10 12:25:51

标签: javascript jquery ajax

我的脚本对我的服务器进行了大约15次ajax调用。我希望它们并行执行。我正在尝试使用when并行执行一堆ajax请求,但出于某种原因,它仍在逐个执行。

我的代码如下:

var requests = $.map(results, function(result, i) {
    var suggestionContainer = $('<div class="suggestion-' + i + '">' + result + '</div>');
    resultsContainer.append(suggestionContainer);

    return $.get('check.php', { keyword: result }).done(function(res) {
        res = JSON.parse(res);
        suggestionContainer.append(generateSocialMediaList(res.social_media))
                           .append(generateDomainList(res.domains));
    }).fail(function() {
        suggestionContainer.remove();
    });
});

$.when(requests).done(function() {
    console.log('Complete')
}, function() {
    alert('Something Failed');
});

我有什么不对的吗?

我发出15个请求的原因是因为check.php调用了第三方API。 API很慢,遗憾的是没有其他选择。发出15个并行请求将比1个请求快得多,并等待check.php完成。

代码的工作原理如下:

  1. suggestions.php发出请求(未包含该请求,因为它不是解决问题所必需的)。结果存储在数组results
  2. 返回结果(大约15个)并使用map进行迭代。
  3. 我将建议插入页面。然后我回复了一个承诺。
  4. requests数组现在包含10-15个承诺。
  5. 我使用when并行执行请求(这至少是我尝试做的事情。)
  6. 成功后,DOM会更新,check.php的结果会被插入到DOM中。

1 个答案:

答案 0 :(得分:2)

您的代码将使用浏览器允许的尽可能多的并行性来执行请求。

浏览器用于将对单个域的并发请求限制为6.这可能已更改。

这些请求的 响应 将逐个提供服务,因为JavaScript是单线程的,这就是您所观察到的。

另外:仔细检查你的AJAX通话是否失败。只要任何承诺被拒绝,when就会拒绝。