2016-07-10 24 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

你能否給我們一個原因,說明你最初會發出15個http請求(沒有談論js和css資產)? – Ismail

+0

'requests'包含一個'$ .get()'ajax請求數組。我提出了15個請求,因爲我的'php'腳本調用的API服務器必須按順序進行。他們不接受批量請求。這個API也很慢,所以我不做15個獨立的調用,而不是讓用戶等待所有15個完成。 – BugHunterUK

+0

@hamism另外,請求不會馬上發生。當用戶按下按鈕時發生。我只包含了導致問題的相關代碼。 – BugHunterUK

回答

2

您的代碼將以瀏覽器允許的並行度執行請求。

用於將併發請求限制爲單個域到6的瀏覽器。這可能已更改。

響應這些請求將由一個被服務的一個,因爲JavaScript是單線程的,這是你在觀察什麼。

另請參見:仔細檢查您的AJAX調用是否失敗。 when只要任何承諾被拒絕就會拒絕。

+0

這很有道理。如果它失敗了,那麼成功的請求會傳遞給'.fail'方法,因爲它們在'.done'中? – BugHunterUK

+0

我不這麼認爲。錯誤將被傳遞。 – Ben