2016-05-31 16 views
0

呼ばれないエラーハンドラは、このコードQ約束チェーン、

var tryWithoutReindexing = function(indexName, properties) { 
     var settings = properties["settings"]; 
     var mappings = properties["mappings"]; 
     return elastic.closeIndex(indexName) 
      .then(elastic.putSettings(indexName, settings)) 
      .then(elastic.putMapping(indexName, mappings)) 
      .then(elastic.openIndex(indexName)); 
}; 

、コール考えてみましょう:

tryWithoutReindexing(indexName, newProperties) 
.then(function success(value){ 
     console.log('migration successful'); 
    }, function error(){ 
     console.log('migration unsuccessful'); 
    }); 

をメソッドelastic.putSettingsでエラーが発生しますが、いくつかの理由で、consoleログ'migration is successful'ため。エラーハンドラが呼び出されると思います。

私はこれまでの方法を変更する場合:

var tryWithoutReindexing = function(indexName, properties) { 
     var settings = properties["settings"]; 
     var mappings = properties["mappings"]; 
     return elastic.closeIndex(indexName) 
      .then(elastic.putSettings(indexName, settings)) 
       .then(function success() { 
       console.log('err'); 
      }, function(error) { 
       console.log(error); 
      }) 
      .then(elastic.putMapping(indexName, mappings)) 
      .then(elastic.openIndex(indexName)); 
}; 

、およびラインconsole.log(error);にブレークポイントを入れて、エラーハンドラが呼び出されるので、putSettingsメソッドが正しく動作するように思われます。

誰も私の最初の例では、約束のチェーンで発生したエラーを処理しない理由を説明できますか?

+0

実際のコードを表示しているようではありません。あなたの代わりのバージョンのメソッドは、 'settings'と' mappings'を割り当てる行を持っていますが、あなたの最初のバージョンはこれを持っていませんが、それらの変数を使います。実際に問題を引き起こすものにあなたのコードを貼り付けてください。ただし、ここにそのままコピーすることができます。悪魔が細部にいるので実際のコードを見る必要があります。 – JLRishe

+0

@JLRheheが更新されました。これは簡潔さのために省略した唯一の違いです。 – Raston

答えて

2

私はelastic.putSettings()らが約束を返すと仮定します。 .thenの引数として約束を使うことはできません。そのメソッドは関数引数を期待しています。しかし、これらの関数は約束を返すことができます。

したがって、約束返却関数を無名関数でラップし、その関数を.thenの引数として使用する必要があります。同様に:

var tryWithoutReindexing = function(indexName, properties) { 
    var settings = properties["settings"]; 
    var mappings = properties["mappings"]; 

    return elastic.closeIndex(indexName) 
       .then(function() { 
        return elastic.putSettings(indexName, settings); 
       }) 
       .then(function() { 
        return elastic.putMapping(indexName, mappings); 
       }) 
       .then(function() { 
        return elastic.openIndex(indexName); 
       }); 
}; 
+0

ok、答えは正しいですが、私は明確化が必要です。 elastic.putSettings(indexName、settings)は約束を返す関数ラッパーです。 putSettings:function(indexName、settings){ return client.indices.putSettings({ インデックス:indexName、 body:settings }); }、 なぜこれがうまくいかなかったのですか?これは関数の引数であり、約束ではありません(私が推測する) – Raston

+0

私は思っています。私がやったことは、引数で関数を呼び出すことでした。引数にバインドする関数参照を渡す方法はありますか?ファットの矢印と関数ラッパーはオプションですが、私はクリーナーコードのために1つのライナーを探しています – Raston

+1

@Rastonこれを試してください: '.then(elastic.putSettings.bind(elastic、indexName、settings))' '簡潔ですが、必ずしもクリーナーIMOではありません) – robertklep

関連する問題