私は約束のメモリモデルを本当に理解していません。私は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) '.connectToAddressAndService'が決して解決または拒否されない場合、その関数で使用されるメモリ空間は生きているだけでなく、' connectToAddress'も生き続けるでしょうか? 2)そして、この '.connectToAddress'をもう一度呼び出すと、スタックのための別のメモリ空間が再び作られますか? – huggie
@huggie - これは '.connectToAddressAndService()'で何が起こっているかによって決まります。実行可能なものへの正当な参照を保持していて、決して解決できない(たとえ実際にはそうでなくても)拒否できれば、それは他のものをすべて生かし続けることになり、メモリが解放されない可能性があります。これは実際には '.connectToAddressAndService()'の内部構造に依存します。 – jfriend00