Javascript как ждут обещания внутри расширения Ошибка - PullRequest
1 голос
/ 14 октября 2019

В настоящее время я пытаюсь расширить стандартный класс 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 (пожалуйста, не обращайте внимания на эту функциюотлично работает в других обстоятельствах).

На самом деле, я даже не знаю, возможно ли выполнять такие вещи прямо из конструктора. Я надеюсь, что контекст достаточно ясен, спасибо за ваше время!

1 Ответ

0 голосов
/ 14 октября 2019

Оператор ожидания используется для ожидания обещания. Его можно использовать только внутри асинхронной функции.

Это означает, что вы не можете использовать его в глобальной области видимости или в конструкторе класса.

Конструктор, использующий обещание, является плохой практикой, потому что вы будетене сможет получить класс также (ссылка на другой ответ stackoverflow) .

Технически вы можете вернуть Promise из конструктора, но это не его цель.

В вашем случае вы можете использовать функцию перед вызовом броска, это не красиво, но оно делает свою работу.

As:

async generateAsyncError(asyncFn) {
  await asyncFn();

  throw new Error();
}

Здесь вы можете использовать async перед выдачей ошибки,Но имейте в виду, что ошибка не будет сброшена до завершения асинхронной функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...