2016-09-14 4 views
1

角度1.5.8は、約束の配列をとり、最初に解決された約束の値で解決される約束を返します$q.race()メソッドを実装します。

しかし、私は今のところ角度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) 
    } 
}) 

質問

私はこれだけ一度に2つの約束のために働く必要がある

:よりエレガントな解決策はの改善$q -apiへのアクセスを持たずにあり

myRaceFkt(p1,p2) 
    .then(successcallback) 

1.5.8?

+0

正確に何をしたいですか? – charlietfl

+2

オープンソースのメリットの1つ - 自分の実装を自分で見ることができます:https://github.com/angular/angular.js/blob/master/src/ng/q.js#L635 –

+0

2つの約束 'q1 'と' q2'では、私は約束のうちの1つが解決すると直ちに関数を呼びたいと思います。 functioncallのパラメータは、約束が解決されたデータである必要があります。 –

答えて

1
function myRaceFn(promises){ 
    return $q(function(resolve, reject) { 
    promises.forEach(function(promise) { 
     promise.then(resolve, reject); 
    }); 
    }); 
} 
myRaceFn([promise1, promise2]).then(.... 
+0

なぜ '.bind(defer)'を使うのですか?bindを呼び出さずにこれを試してみましたが、意図したとおりに動作するようです。 –

+1

オブジェクトメソッドを使用すると、この参照を持つかどうかわからないので、ソースコードを読み取らずにbindとunsafeを使っても安全です –

関連する問題