2015-09-19 5 views
6

私はPromiseを返す関数を持っています。Promiseの "then"機能を使用しないと、(否定的な)副作用はありますか?

これで、消費者はそのPromiseで「then」関数を使用することが理にかなっていることがあります。しかし、時には消費者はプロミスがいつ解決するのか、その結果については気にしません。言い換えれば、同じ機能が「火と忘れ」の仕方で呼び出されるべきです。

だから私は、これら2つの使用シナリオたい:

func().then(...); // process Promise 
func(); // "fire and forget" 

これを明らかに動作しますが、これは「悪い習慣」とみなされた場合、特にこの使用パターンは、任意の望ましくない副作用を持つことができるのだろうか、すなわち。メモリリークにつながる?今私はブルーバードを使用していますが、それが何らかの差異を生むならば、私は本来の約束に切り替えることを検討します。

+0

1を出力します問題。しかし、あなたがメモリリークについて尋ねたように..私は知りたいのです:) – agpt

+1

[nodejs(ES7)で約束を忘れることができますか?](http://stackoverflow.com/q/32384449/) 1048572)(これは 'async' /' await'構文を使用しますが、前提は同じです) – Bergi

+0

はい、Bergiは少なくとも類似しています - 申し訳ありませんが、申し訳ありません。違いは、私はノードを使用していないことです。 –

答えて

4

thenを呼び出すたびに新しい約束ができます。したがって、決まったハンドラが結ばれていないという約束の結果としてメモリリークを起こしたPromiseの実装は、壊れた実装となります。私は、これまでに実装されているいくつかのエンジンでES6の本来の約束を疑うか、ブルーバードにそのような振る舞いがあります。

概念的には、約束の解決ハンドラは、基本的には配列やリストに格納された関数であり、適切なときに呼び出されます。これらの配列/リストに関数を置かないとメモリリークは起こりません。

thenが新たな約束を返すということは考える、驚きの場合:

let p1 = new Promise(resolve => { 
    setTimeout(() => { 
    resolve('a'); 
    }, 100); 
}); 
let p2 = p1.then(result => { 
    console.log("p1.then got " + result); 
    return 'b'; 
}); 
p2.then(result => { 
    console.log("p2.then got " + result); 
}); 

私はそれがいずれかを引き起こすと思ういけないけれども、

 
p1.then got a 
p2.then got b 

Live Copy on Babel's REPL

+0

良い議論、ありがとう! –

+1

私は「悪い練習」の部分には対処していないと思われます。しかし、関数の戻り値を使用しないことは本当に一般的であることに注意してください。おそらく、約束事にハンドラーを追加しないという非約束の同等物です。 –

関連する問題