В настоящее время я пытаюсь расширить стандартный класс Error javascript для проблем с процессами, точнее, я хочу проверять данные FTP при выдаче customError. Проблема в том, что он никогда не ждет завершения функции ожидания перед броском. Ожидаемая функция также возвращает обещание.
Насколько я знаю, у меня есть этот пример кода для моего класса, обратите внимание, что remoteFs - это просто пользовательский модуль, содержащий мои функции для манипулирования данными удаленного FTP.
module.exports = class processError extends Error {
constructor(args) {
super(args);
this.name = "customError"
this._folder = "./test/"
this._credentials = {
host: 'my.host.com',
user: 'username',
password: 'passwd123',
}
return (this._errorProcess());
}
async _errorProcess () {
try {
// The function below is basic FTP list and should return a promised true/false if the folder exists or not.
let IsThereFolder = await remoteFs.EntityExist(this._credentials, this._folder)
} catch (err) {
throw new Error("Fatal error in error handler:", err)
}
console.log("Should I create folder ?", IsThereFolder )
return (this);
}
}
Я попробовал несколько методов, чтобы заставить конструктор ждать, например, вызов _errorProcess из функции init (), которая возвращала бы его после вызова из конструктора. Я также пытался вывести эту функцию из области видимости класса, но, похоже, ничего не работает должным образом, я всегда получаю вывод броска до получения моего обещания.
module.exports = {
EntityExist: function (credentials, toFind) {
var c = new Client();
let entityExist = false;
return new Promise((resolve, reject) => {
console.log("CREDENTIALS ->", credentials)
c.on('ready', function () {
console.log("Connection established");
c.on('error', function (err) {
console.log(err);
reject(err);
})
c.list(toFind, (err, list) => {
if (err) throw err;
for (let i = 0; i < list.length; i++) {
if (list[i].name == toFind) { entityExist = true; }
}
c.on('end', () => { resolve(entityExist); })
c.end();
});
});
console.log("Before connect")
c.connect(credentials);
})
}
};
И вот фактический вывод, который я получаю для этоговыполнение:
CREDENTIALS -> { host: 'my.host.com',
user: 'username',
password: 'passwd123' }
Before connect
C:\path_to_project\includes\file.js:62
throw new handleError("Testing custom error: " + err); break;
^
[object Promise]
npm ERR! code ELIFECYCLE
npm ERR! errno 1
(...)
Итак, как вы можете видеть, он не ждет возвращения обещания и даже не достигает журнала «Соединение установлено» в функции EntityExist (пожалуйста, не обращайте внимания на эту функциюотлично работает в других обстоятельствах).
На самом деле, я даже не знаю, возможно ли выполнять такие вещи прямо из конструктора. Я надеюсь, что контекст достаточно ясен, спасибо за ваше время!