Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS:$q.race()在旧的angular版本中_Javascript_Angularjs_Promise_Angular Promise - Fatal编程技术网

Javascript AngularJS:$q.race()在旧的angular版本中

Javascript AngularJS:$q.race()在旧的angular版本中,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,Angular 1.5.8实现了一个$q.race()方法,该方法接受承诺数组并返回一个承诺,该承诺与第一个已解析承诺的值进行解析 不过,我现在仍坚持使用angular 1.4,需要一些功能,如$q.any或$q.race方法 目前,我使用.then()中的标志来“记住”承诺的状态,这显然是不理想的 var resolvedPromise = null; promise1.then(function(data){ if(!resolvedPromise === 'promise2'){

Angular 1.5.8实现了一个
$q.race()
方法,该方法接受承诺数组并返回一个承诺,该承诺与第一个已解析承诺的值进行解析

不过,我现在仍坚持使用angular 1.4,需要一些功能,如
$q.any
$q.race
方法

目前,我使用
.then()
中的标志来“记住”承诺的状态,这显然是不理想的

var resolvedPromise = null;

promise1.then(function(data){
  if(!resolvedPromise === 'promise2'){
    resolvedPromise = 'promise1';
    successcallback(data)
  }
})

promise2.then(function(data){
  if(!resolvedPromise === 'promise1'){
    resolvedPromise = 'promise2';
    successcallback(data)
  }
})
问题

我一次只需要这两个承诺:

myRaceFkt(p1,p2)
  .then(successcallback)

有没有一个更优雅的解决方案,而不必访问改进的
$q
-api 1.5.8?

您到底想做什么?开源的好处之一-您可以自己看看它们的实现:给出两个承诺
q1
q2
,当其中一个承诺解决时,我想立即调用一个函数。functioncall的参数必须是用于解析承诺的数据。@JoeClay谢谢!我试图通过使用
$provide.decorator('$q',function($delegate){$delegate.race=…}
将此添加到我的
$q
-服务中,但由于$delegate似乎不是我可以扩展的对象,所以被卡住了。有人能给我一个语法提示吗?为什么要使用
.bind(defer)
?我在没有调用bind的情况下尝试了这个方法,当您使用object方法时,它似乎按照预期工作,您永远不知道它是否具有此引用。因此,在不阅读源代码的情况下使用bind和safe是安全的
function myRaceFn(promises){
   return $q(function(resolve, reject) { 
     promises.forEach(function(promise) {
       promise.then(resolve, reject);
     });
   });
}
myRaceFn([promise1, promise2]).then(....