2014-10-08 120 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