2016-08-19 17 views
2

私は約束オブジェクトを受け入れ、最終的に解決または拒否する前に約束を何回か再生する一般的な "再試行"機能を作成しようとしています。ES6の約束をクローンすることは可能ですか?

約束を受け入れるコードを書いており、1つが成功するか、すべてが失敗するまで順番に働きます。

var first = function(promiseArr){ 
 
    return promiseArr.reduce(function (prev, next) { 
 
     return prev.catch(()=>next) 
 
    }); 
 
}; 
 

 
first([Promise.reject("1"), Promise.resolve("2"), Promise.reject("3")]) 
 
.then(function(data){ 
 
    console.log('resolved with '+data); 
 
}, function(err){ 
 
    console.log('rejected with '+err); 
 
});

私は今、約束を受け入れ、約束のディープコピークローンとサイズNの配列を移入する関数を記述しようとしています。私はそれをバニラオブジェクトで動作させることに成功しましたが、私はそれを有望なオブジェクトで動作させることはできません。

私は実行機能を受け入れて自分自身で約束を築くことができたことに気がつきましたが、プロジェクトで既に約束されている機能を再利用できるようにしたいと思います。

var retry = function(promise, maxCount){ 
 
    return first(Array(maxCount).fill(function(){ 
 
     //return a deep copy of the promise passed in 
 
    }) 
 
    }

+4

「将来価値」として有望と考えてください。値ではなく、関数です。値を再生することはできません。再試行を実装するには、関数(約束を作成する)またはObservablesを「強力」にする必要があります。 –

+0

渡された約束から実行中の機能を引き出して他のものの構築に使用する方法があるかもしれませんか? –

答えて

3

それが意味することになっているものは何でも約束の「深いクローン」を作成し、それらを介してプレイするあなたのアプローチは、欠陥があります。再試行のためのパラダイム約束は

function foo() { 
    return doSomething().catch(foo); 
} 

よりも複雑なものではありませんそして、あなたが再試行回数のためのロジックを追加します。

function retry(n) { 
    return function foo() { 
    if (!n--) return Promise.reject("max retries exceeded"); 
    return doSomething.catch(foo); 
    }(); 
} 
+0

私はあなた自身がチェーンの約束を実行する関数を再帰することができることを知っていますが、私の問題は、私が目に見えない約束を受けているということであり、あなたが説明したことを一般的なものにする必要があります。 catchステートメントにそれをパックするために実行する関数を決定する方法があれば、それは私の問題を解決するのに十分でしょう。 –

+2

できません。エグゼクティブは、約束の構築の隠された詳細です。 –

+0

作成した約束を外部から渡した場合(上記の 'doSomething'など)、オプションは厳しく制限されています。あなたは 'それ'と 'キャッチ'を止めることができますが、それを「再生」や「再作成」や「複製」する方法はありません。 –

関連する問題