2016-05-31 10 views
0

Betrachten Sie diesen CodeQ Versprechen Verkettungs, Fehlerbehandlung nicht genannt

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)); 
}; 

Und rufen:

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

Methode elastic.putSettings Fehler wirft, aber aus irgendeinem Grund, console Protokolle 'migration is successful'. Ich würde erwarten, Fehler-Handler aufgerufen werden.

Wenn ich Methode dies zu ändern:

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)); 
}; 

und setzte Haltepunkt in Zeile console.log(error);, wird die Fehler-Handler aufgerufen, so scheint es, dass putSettings Methode richtig funktioniert.

Kann mir jemand erklären, warum das erste Beispiel keinen Fehler in der Versprechungskette behandelt?

+0

Es scheint nicht, dass Sie uns Ihren tatsächlichen Code zeigen. Ihre alternative Version der Methode hat Zeilen, die 'settings' und' mappings' zuweisen, während Ihre erste Version dies nicht hat, aber immer noch diese Variablen verwendet. Bitte zerlegen Sie Ihren Code auf etwas, das das Problem tatsächlich verursacht, aber Sie können hier unmodifiziert kopieren. Wir müssen tatsächlichen Code sehen, weil der Teufel im Detail ist. – JLRishe

+0

@JLRishe aktualisiert, das war der einzige Unterschied, den ich zur Kürze weggelassen habe – Raston

Antwort

2

Ich gehe davon aus, dass elastic.putSettings() et al. Ein Versprechen abgeben. Sie können ein Versprechen nicht als Argument für .then verwenden; Diese Methode erwartet Funktion Argumente. Im Gegenzug können diese Funktionen jedoch ein Versprechen abgeben.

Also, Sie müssen Ihre Versprechen zurückgeben Funktionen mit einer anonymen Funktion, und verwenden Sie diese Funktion als das Argument für die .then 's. Wie so:

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, die Antwort ist richtig, aber ich brauche eine Klarstellung. elastic.putSettings (Indexname, Einstellungen) ist eine Funktion, die Wrapper Versprechen zurückgibt: putSettings: Funktion (Indexname, Einstellungen) { return client.indices.putSettings ({ Index: Indexname, Körper: Einstellungen }); }, Warum genau das nicht funktioniert? Dies ist ein Funktionsargument, kein Versprechen (ich denke) – Raston

+0

Ich verstehe, denke ich. Was ich getan habe, war Funktion mit Argumenten aufzurufen, was zu Versprechen führt. Gibt es eine Möglichkeit, Funktionsreferenz mit Argumenten zum Binden zu übergeben? Fette Pfeile und Funktionswrapper sind Optionen, aber ich bin auf der Suche nach einem Liner für sauberer Code – Raston

+1

@Raston versuchen Sie dies: '.then (elastic.putSettings.bind (elastisch, indexName, Einstellungen))' (es macht den Code mehr prägnant, aber nicht unbedingt sauberer IMO) – robertklep