2016-06-02 14 views
0

私は約束のメモリモデルを本当に理解していません。私はBluebird 2.xを使用しています。Bluebirdの使用を約束していますか?

私はこれをBluetoothデバイスに接続しようとしています。 10秒以内に接続できない場合は、閉じて失敗として戻したいと思っています。

Control.prototype.connectToAddress = function connectToAddress(address) 
{ 
    var self = this; 

    return new Promise(function(resolve, reject) { 

    var timer = setTimeout(function() { 
     reject(new Error('Timeout')); 
    }, 10000); 

    self.bt.connectToAddressAndService(address, self.service) 
    .then(function(dev) { 
     clearTimeout(timer) 
     resolve(dev); 
    }) 
    .then(function error(err) { reject(err); }); 

    }); 
} 

これは実際の状況ではありません。実際の状況では、デバイスが接続されるのを待たずにすぐにconnectToAddressが解決されます。エミッタは後で設定され、呼び出し元にデバイスが見つかったことを通知します。しかし、質問のために、connectToAddressが実際に接続されたデバイスを待って返すとします。

10秒以内にデバイスに接続できない場合は、スキャンした後に離れてしまう可能性があります。約束は拒否されます。しかし、self.bt.connectToAddressAndServiceコールは解決または拒否のいずれかに解決されていません。このような状況でconnectToAddressが繰り返し呼び出されると、何らかの種類のメモリスタックが構築され、決して解放されませんか?もしそうなら、私はこれを避けるために何ができますか?

答えて

1

プロミスは、他のJavascriptオブジェクトと同様にガベージコレクションされたJavascriptオブジェクトです。したがって、約束を無期限に保持しない限り、他のオブジェクトが使用されなくなったときと同様にガベージコレクションされます。あなたのタイマーがまだ起こっているか.connectToAddressAndService()はまだ何かをやっているよう

だから、あなたの具体的な例では、あなたがあなたの関数に示した状態は限り生き続けるだろうと今でも拒否またはそれがまだ生きている意味(解決することができるかもしれません解決ハンドラーまたはリジェクトハンドラーへの参照)。タイマーは明らかに10秒の固定寿命を持っています。しかし、あなたは.connectToAddressAndService()の後ろにあるコードを表示しないので、実際にどれくらい長く生きているかもしれないという情報は提供できません。それは決して解決するか、またはある時点で拒絶するので、この内部状態を生き生きと保つことが永遠に続く可能性はありません。その問題が現在問題であるかどうかを知るためには、コード内のコードを参照する必要があります。

操作をタイムアウトしても、.connectToAddressAndService()がまだ生きていて、将来的にはそれ自身の解決または拒否ハンドラと呼ばれることがありますが、最終的に終了するのを待っている間はまだメモリが使用されています。約束がすでに拒否されているにもかかわらず、Javascriptはあなたの他のコード.connectToAddressAndService()が何をしているのかわからないので、あなたが示しているコードの内部状態は生きていてメモリに保持されます。

+0

1) '.connectToAddressAndService'が決して解決または拒否されない場合、その関数で使用されるメモリ空間は生きているだけでなく、' connectToAddress'も生き続けるでしょうか? 2)そして、この '.connectToAddress'をもう一度呼び出すと、スタックのための別のメモリ空間が再び作られますか? – huggie

+0

@huggie - これは '.connectToAddressAndService()'で何が起こっているかによって決まります。実行可能なものへの正当な参照を保持していて、決して解決できない(たとえ実際にはそうでなくても)拒否できれば、それは他のものをすべて生かし続けることになり、メモリが解放されない可能性があります。これは実際には '.connectToAddressAndService()'の内部構造に依存します。 – jfriend00

関連する問題