2016-11-24 3 views
2

Я пытаюсь написать базовый класс для sequelize.js. Этот класс свяжет все связанные таблицы. includeFk выполняет эту задачу. Но он имеет обещание и должен быть рекурсивным. Класс:Рекурсивная функция Ecmascript 6 с обещанием

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

Ошибка:

(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

ответ

5

У вас есть ручка ошибки из Promise.all, потому что он также возвращает обещание, и вы должны справиться с этим, если не научить его возвращенного обещание.

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

Я также думаю, что ваш this связывание не в правильном объеме. Если вы получаете ошибку неопределенной функции, попробуйте указать this с переменной перед вызовом функций класса.

Пример:

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

Это обрабатывает только сообщение об ошибке. Но моя проблема в том, что обещания не работают с рекурсивными функциями. – osmanraifgunes

+0

Первой проблемой является то, что вы не можете получить значение журнала ошибок, если не обрабатываете ошибки, возникшие в обещании. Я считаю, что в области функций что-то не так, поэтому рекурсивная функция работает неправильно. – iKoala

+0

Теперь журнал ошибок: TypeError: Невозможно прочитать свойство Symbol (Symbol.iterator) 'неопределенного в Function.all (native) – osmanraifgunes

Смежные вопросы