1

まあ、私はすでに約束を理解していると思っていましたが、これについて何かが欠けているようです...

var redisPromise = new Promise(function(resolve, reject) {
  redisClient.on('error', reject);
  redisClient.on('ready', resolve);
}).then(function() {
  // THIS ISN'T CALLED - CORRECT
  log.enabled && log('connected, version: %s', redisClient.server_info.redis_version);
  return redisClient;
}).catch(function() {
  // THIS GETS CALLED - CORRECT
  log('failed connecting to database:', e.message);
});

redisPromise.then(function() {
  log("This shouldn't be called when connection fails");
});

Redis への接続が失敗した場合、返された Promise が拒否されることが予想されます。しかし、なぜか満たされている。ここで何か不足していますか?

ブルーバードの実装を使用しています。そこに何らかのバグがある可能性がありますか?それはすべて非常によく文書化されており、理にかなっているように思えます...紙の上では。

解決済み

https://github.com/petkaantonov/bluebird/issues/156での完全な議論

4

3 に答える 3

1

then一部のライブラリで新しい promise を作成します。私の推測では、bluebird も でプロミスを作成しcatchます。それらを連鎖させた方法redisPromiseは、最初の約束ではなく、「キャッチ」の約束を指します。そして、「キャッチ」は確かに解決されます。

私が正しければ、これは期待どおりに機能するはずです。

var redisPromise = new Promise(function(resolve, reject) {
  redisClient.on('error', reject);
  redisClient.on('ready', resolve);
});

redisPromise.then(function() {
  // THIS ISN'T CALLED - CORRECT
  log.enabled && log('connected, version: %s', redisClient.server_info.redis_version);
  return redisClient;
}).catch(function() {
  // THIS GETS CALLED - CORRECT
  log('failed connecting to database:', e.message);
});

redisPromise.then(function() {
  log("This shouldn't be called when connection fails");
});
于 2014-03-19T19:10:34.857 に答える
1

単純に欲しいものじゃないですか

new Promise(function(resolve, reject) {
  redisClient.on('error', reject);
  redisClient.on('ready', resolve);
}).then(function() {
  // THIS ISN'T CALLED - CORRECT
  log.enabled && log('connected, version: %s', redisClient.server_info.redis_version);
  return redisClient;
}).then(function() {
  log("This shouldn't be called when connection fails");
}).catch(function() {
  // THIS GETS CALLED - CORRECT
  log('failed connecting to database:', e.message);
});

これは次と同じです:

try {
   var redisClient = ...
   log.enabled && log('connected, version: %s', redisClient.server_info.redis_version);
   log("This shouldn't be called when connection fails");
} 
catch(e) {
   log('failed connecting to database:', e.message);
}
于 2014-03-19T20:52:18.063 に答える