2016-11-24 3 views
2

Ich versuche, eine Basisklasse für Sequelize.js zu schreiben. Diese Klasse verknüpft alle zugehörigen Tabellen. includeFk Funktion diese Aufgabe realisieren. Aber es hat ein Versprechen und sollte rekursiv sein. Klasse:Ecmascript 6 rekursive Funktion mit Versprechen

class base { 
    constructor(table, depth) { 
     this._table = table; 
     this._depth = depth; 

    } 

    includeFK(table, depth, includes) { 
     return new Promise((resolve, reject) => { 
       if (depth <= this._depth) { 
        for (var att in table.tableAttributes) { 

         table.belongsTo(m, { 
          as: m.name, 
          foreignKey: att 
         }) 
         includes.push({ 
          model: m 
         }); 

        } 
       } 

       Promise.all(

        Object.keys(table.associations).forEach(tbl => { 
          this.includeFK(table.associations[tbl].target, depth + 1, includes); 
         } 

        )).then(results => { 
        resolve(true) 
       }); 
      } else { 
       resolve(true); 
      } 
     }); 



    all(query) { 
     return new Promise((resolve, reject) => { 
      var tmp = this; 
      var includes = []; 

      Promise.all([ 
       this.includeFK(tmp._table, 1, includes), 
       this.includeLang() 
      ]).then(function() { 

       tmp._table.findAll({ 
        include: includes 
       }).then(function(dbStatus) { 
        resolve(dbStatus); 
       }); 
      }); 
     }); 
    } 
} 

Fehler:

(node:25079) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 3): TypeError: Cannot read property 'Symbol(Symbol.iterator)' of undefined (node:25079) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code. (node:25079) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 4): TypeError: Cannot read property 'Symbol(Symbol.iterator)' of undefined

Antwort

5

Sie haben die die Fehler von Promise.all handhaben, weil es auch ein Versprechen zurück, und Sie müssen es zu handhaben, wenn Sie es an die zurück Versprechen trainieren.

Promise.all([...]) 
    .then(...) 
    .catch(function(err) { 
     console.error(err); 
     reject(err); 
    }); 

Edit:

var promiseArr = []; 

Object.keys(table.associations).forEach(tbl => { 
    promiseArr.push(
    self.includeFK(table.associations[tbl].target, depth + 1, includes) 
); 
}); 

Promise.all(promiseArr) 
    .then(results => { 
    resolve(true) 
    }); 

Ich denke auch, Ihre this Bindung ist nicht im richtigen Bereich. Wenn Sie den Fehler einer nicht definierten Funktion erhalten, versuchen Sie, vor dem Aufruf von Klassenfunktionen auf this mit einer Variablen zu verweisen.

Beispiel:

includeFK(table, depth, includes) { 
    var self = this; //ref this and use it later 
    ... 
     ... 
      self.includeFK(); 
+0

Es behandelt nur Fehler. Aber mein Problem ist, dass Versprechen nicht mit rekursiven Funktionen arbeiten. – osmanraifgunes

+0

Das erste Problem besteht darin, dass Sie kein Bedeutungsfehlerprotokoll erhalten können, wenn Sie die in der Zusage geworfenen Fehler nicht behandeln. Ich glaube, mit dem Funktionsumfang stimmt etwas nicht, daher funktioniert die rekursive Funktion nicht richtig. – iKoala

+0

Jetzt Fehlerprotokoll ist: TypeError: Kann nicht gelesen werden Symbol (Symbol.iterator) 'von undefined bei Function.all (native) – osmanraifgunes