2016-09-01 4 views
-1

約束を返すだけで呼び出され、.thenでチェーンされた関数を返す関数を作成するためのきれいな方法があるかどうかを知りたいと思います。コールサイトに基づいて機能や約束を返す方法は?

例:

// returns a promise. use to start chains: 
// eg: wait(400).then(...) 
const wait_p = (t) => new Promise(resolve => setTimeout(resolve, t)); 

// returns a function: use inside .then(): 
// eg: $get('whatever').then(wait_f(300)) 
const wait_f = (t) =>() => wait_p(t) 

単一wait()機能に合併wait_f wait_pとの両方を持っているクリーンな方法は何ですか?

//hypotetically: 
const put = (x) =>() => console.log(x) 
wait(1000) 
    .then(put('one')) 
    .then(wait(1000)) 
    .then(put('two')) 
+0

'Promise.resolve(wait_p(t))'で解決済みの約束を返すことができますが、 'wait_p'が失敗する可能性があるので、' Promise'をラップする必要があります。 – thefourtheye

+0

また、多型戻り型の関数は、呼び出し元には驚きでしょう – thefourtheye

+0

それは混乱していて良いことではないことは間違いありません。しかしまだ... – deddu

答えて

1

私はあなたがthen方法で機能を返すことができると思います:統合失調症の機能を持つ

const wait = t => { 
 
    var p = new Promise(resolve => setTimeout(resolve,t)); 
 
    var func =() => p; 
 
    func.then = (...args) => p.then(...args); 
 
    return func; 
 
} 
 
wait(400).then(() => console.log('Hello')) 
 
Promise.resolve().then(wait(500)).then(() => console.log('World'))

+2

この問題は、 'wait()'の結果に対して実際に '.then()'を呼び出すまで、タイムアウトが始まらないこともあります。だから、あなたは単に 'wait()'の結果を変数に格納し、その変数が保留中の約束であると期待することはできません。この問題のもう一つの問題は、その変数に対して '.then()'を複数回呼び出すと、複数のタイムアウトが設定され、同時にどれも解決されないということです。 – idbehold

+0

@idbehold良い点。今は期待どおりに動作すると思います。 – Oriol

+0

美しい。期待どおりに動作します。 – idbehold

2

は、あなたがどのように把握できたとしても、おそらく素晴らしいアイデアではありませんそれをするために。 1つを選択して使用します。次のいずれかの

wait_f(1000)().then(wait_f(1000))... 

または

wait_p(1000).then(() => wait_p(1000))... 

は個人的に私は頻繁にあなたの wait_fのような機能を使用しますが、私はめったに自分が約束チェーンを開始するためにそれを使用したい見つけることはありません。

+3

"*統合失調症機能*" - LOL、しかし非常にフィッティング! – Bergi

関連する問題