2016-05-04 8 views
0

約束があるとしましょう。 checkOnSomeValue()となり、処理が始まる前の最初の2秒間約束checkOnSomeValue()は拒否されます。そして、約2秒後に約束が値を解決します。エラーがスローされなくなるまで何度も投票するという約束がある

プロミスがxミリ秒ごとに実行され、ネストされた約束が解決されたときにラッパーの約束を解決できるように約束する方法はありますか?

+0

あなたはあなたの例をより明示できますか?いくつかのサンプルコードは素晴らしいでしょう – Yerken

答えて

2

は私がどうなるのかです:

function poll(fn, ms) { 
    return fn().catch(e => Promise.delay(ms).then(() => poll(fn, ms))); 
} 

基本的に、それはmsミリ秒待ってから再度試して失敗したときに、機能を試してみてください。

var polled = poll(checkOnSomeValue, 2000); 

polled().then(v => { 
    // your resolved value here ^_^ 
}); 

それともconst co = Promise.coroutineと発電機との:あなたは再帰を避けることができます

const poll = co(function*(fn, ms) { 
    while(true) { 
     try { 
     return yield fn(); 
     } catch (e) { 
     yield Promise.delay(ms); 
     } // ignore rejections 
    } 
}); 

1

ここには1つの方法があります。ここで

function waiter() { 
    return new Promise((resolve) => { 
    let interval = setInterval(() => { 
     return client.getBalanceAsync('*', 6) 
     .then(value => { 
      clearInterval(interval) 
      return resolve(value) 
     }) 
     .catch((err) => { 
     }) 
    }, 200) 
    }) 
} 
+2

ここで 'setInterval'を使うのではなく、' setTimeout'を使うべきです。そうでなければ、 'getBalanceAsync'が' 200ms'より長く続くならば、約束を '解決する'でしょう。 –

+0

'setTimeout'は約束を一度呼び出すつもりです。私はそれを複数回呼び出す方法が必要です。 – ThomasReggi

+0

これは延期された反パターンです。よろしくお願いします。 –

0

私はBenjamins answerと基本的には行くが、わずかに異なる実装ではと思います:

function poll(fn, ms) { 
    var resolve =() => fn().catch(retry); 
    var retry =() => Promise.delay(ms).then(resolve); 
    return resolve(); 
} 

大したこと。しかし、何らかの理由で、このピンポンの実装は、私にとってより良い/きれいに/わかりやすく感じます。理由を説明することさえできません。

関連する問題