2016-08-04 3 views
1

私は、やり直しを約束する機能をいくつか持っています。それは一般的には、いくつかのチェックその時、私たちは現在の約束を得ることができますか?

somePromise.then(() => { 
    if(state == "finish") 
     return; 

    // DoSomething async then repeat these codes 
    // could we do it by [return this;] ? 
}).then(() => console.log("finish")); 
+2

'VARを参照してくださいまでdoSomethingAsync()コールの.then()で同じ関数を呼び出す再帰的に、.then()で使用する関数に名前を付けることができます再試行= fn => _ => fn()。catch(再試行(fn)); ' - チェックが失敗した場合はfn throwを使います... usage:' r –

+0

あなたがもう一度 'somePromise.then(()=> {'最初の '.then'の内部のある条件を再実行したいのですか?満足ですか? – James111

答えて

1

あなたはstate == "finish"

// name function used at `.then()` 
somePromise.then(function re(data) { 
    if(state == "finish") { 
     return data; 
    }; 
    // DoSomething async then repeat these codes 
    // call `re` at `.then()` chained to `doSomethingAsync()` 
    doSomethinAsync(data).then(re); 
}).then((data) => console.log("finish", data)); 

multiple, sequential fetch() Promise

+0

@Thaina plnkr http://plnkr.co/edit/n8agR78EZcqILwSWLjQl?p=preview – guest271314

+0

ありがとうございました。コールバックに名前を付けることを忘れるまで、私はコールバックとしてラムダを使いすぎました。これはきれいです – Thaina

3

を渡すまでそれをやり続ける、あなたは.then()ハンドラ内で、現在の約束へのアクセスを得ることはありません。とにかく、とにかく役に立つものはほとんどできませんでした。別の.then()ハンドラを追加しても、あなたがすでに入っている.then()ハンドラとは何も変わりません。実行されると、約束は決して状態を変更しません。

何かを繰り返す場合は、繰り返したいものから機能を作り、.then()ハンドラの中からもう一度呼び出すと、結果として得られた約束事が返されます(前の約束事に引き継がれます)。ここで

は例です:

// utility delay function that returns a promise 
function delay(t, val) { 
    return new Promise(function(resolve) { 
     setTimeout(function() { 
      resolve(val); 
     }, t); 
    }); 
} 

// repeatedly call someAsyncOp() until we see the operation is finished 
function repeatUntil(t) { 
    return someAsyncOp().then(function(state) { 
     if (state !== "finish") { 
      return delay(t).then(repeatUntil); 
     } 
    }); 
} 

// sample usage 
repeatUntil(5000).then(function() { 
    // state is finished here 
}).catch(function(err) { 
    // error here 
}); 
関連する問題