2014-10-08 122 views
1

我正面臨着$ http服務的這個奇怪問題:每一個對我所工作的公司提供的API的請求都包含在$ q.all()中,並返回相同的響應。多個請求,相同的響應

var promises = [ 
    $httpPromiseA(), 
    $httpPromiseB(), 
    $httpPromiseC() 
]; 

$q.all(promises) 
    .then(function (response) { 
     $log.log(response); 
    }); 

// $log.log returns [expectedObjectFromA, expectedObjectFromA, expectedObjectFromA] 

這是隨機發生的:expectedObjectFromA可以是expectedObjectFromB或expectedObjectFromC。事實上,所有三個對象返回相同,或兩個一個,其他等。

如果我鏈接一個接一個,以線性方式,他們都工作完美,但需要更多時間來當然,完成任務。

var def = $q.deferred(); 
var resolvedData = []; 

$httpPromiseA() 
    .then(function (response) { 
     $log.log(response); 

     resolvedData.push(reponse); 

     return $httpPromiseB(); 
    }) 
    .then(function (response) { 
     $log.log(response); 

     resolvedData.push(reponse); 

     return $httpPromiseC(); 
    }) 
    .then(function (response) { 
     $log.log(response); 

     resolvedData.push(reponse); 

     return def.resolve(resolvedData); 
    }); 

return def.promise(); 

// $log.log returns [expectedObjectFromA], 
// [expectedObjectFromB] and [expectedObjectFromC] 
// as expected. ResolvedData brings [expectedObjectFromA, 
// expectedObjectFromB, expectedObjectFromC]. 

你能給我一些指示,說明這裏可能發生了什麼嗎?

我正在使用$ http和$ q的核心實現。我已經嘗試了一個$ q.allSettled,作爲$ decorator應用,基於Kris Kowalk的Q的API資源,但沒有成功。

謝謝。

編輯1:

我無法通過函數的參數分開,因爲它是一個包裝函數調用多數民衆贊成在$http服務,在這裏我的應用程序。包裝函數期望String作爲第一個參數,而Object作爲第二個參數。包裝函數返回$http調用。

編輯2:

Plunker調用2個併發請求,一到Instagram的API,另一個Flickr的API。這個問題不會發生在這個Plunker上。我真的不知道如何處理這個麻煩。這真的很煩人。

+0

var promises = [$ httpPromiseA(),$ httpPromiseB(),$ httpPromiseC()]; (函數(responseA,responseB,responseC){$ log.log(response);}); // $ log.log返回[expectedObjectFromA,expectedObjectFromA,expectedObjectFromA]。您需要分別收集諾言中的每個回覆。嘗試上面的代碼更改希望它起作用 – 2014-10-08 04:59:09

+0

@CoderJohn你看到了這個問題?你的解決方案沒有意義。嘗試處理一個'$ q.all()'就像你建議的那樣...... – 2014-10-08 05:06:22

+0

爲了澄清,你是否試圖解決一個錯誤的/損壞的API,當你嘗試使用併發請求時有時會中斷? – 2014-10-08 07:10:23

回答

0

問題出現在服務器端,它在同時發生的請求時出現問題,回答所有與同一響應一起做出的問題。

感謝您的支持和關注。

0

在$ q.all中,您需要傳遞一個promise數組,而不是執行該函數。 $ httpPromiseA。$ promise而不是$ httpPromiseA()等。

+0

所以我怎麼會通過這些函數的任何參數?在每一個功能中他們都需要他們的論點這對我來說也沒有任何意義。 – 2014-10-08 05:08:35

+0

'var parameters = {}: var promiseA = $ httpPromiseA(parameters); $ q.all([promiseA。$ promise,...,....]);' – user3040068 2014-10-08 05:11:19

+0

我不能以這種方式傳遞參數,因爲它是一個包裝函數,它調用'$ http'服務,在我的應用程序中。包裝函數期望'String'作爲第一個參數,而'Object'作爲第二個參數。包裝函數返回'$ http'調用。 – 2014-10-08 05:23:42