2016-07-10 1 views
2

Мой скрипт совершает около 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.
+0

Можете ли вы дать нам причину, по которой вы сначала запросите HTTP-запрос (не говоря о ресурсах js и css)?. – Ismail

+0

'запросы' содержит массив' $ .get() 'ajax-запросов. Я делаю 15 запросов, потому что сервер API, мой скрипт 'php' вызывает вызовы последовательно. Они не принимают массовые запросы. API также медленный, поэтому, чтобы пользователь не дождался завершения всех 15, я делаю 15 отдельных вызовов. – BugHunterUK

+0

@ amism Кроме того, запросы не происходят сразу. Они происходят, когда пользователь нажимает кнопку. Я включил только соответствующий код, вызывающий проблему. – BugHunterUK

ответ

2

Ваш код будет выполнять запросы с таким же параллелизмом, как позволяет браузер.

Браузеры использовали для ограничения одновременных запросов до одного домена до 6. Возможно, это изменилось.

В ответов на эти запросы будут обслуживаться по одному, так как JavaScript является однопоточным, и это то, что вы наблюдаете.

Также: двойная проверка вашего вызова AJAX не прерывается. when отклонит, как только любое из обещаний будет отклонено.

+0

Это имеет смысл. Если это не удается, это успешные запросы, переданные методу '.fail', так как они находятся в' .done'? – BugHunterUK

+0

Я так не думаю. Ошибка будет передана. – Ben