Node JS: не вызывая обещание reject () обратный вызов останавливает выполнение программы - PullRequest
1 голос
/ 19 января 2020

Кажется, я неправильно понимаю механизм Promise. В следующем коде:

async function CreateSession()
{
      var sessionId = await new Promise((resolve, reject) => {
        request(options, function (error, response, body) {
            if (!error && response.statusCode == 200) {
                log.debug("Session created successfully")
                resolve(body["session-id"]);
            }
            else
            {
                log.error("Failed to create session:");
                log.error(error);
                // reject(error);
            }
        });
    });

    log.debug(`Session Id: ${sessionId}`);
    return sessionId;
}

Функция reject () прокомментирована с целью понять механизм. При вызове вышеупомянутой функции CreateSession () следующим образом и гарантировании возникновения ошибки:

async function MyFunction()
{
    var sessionId = await CreateSession();
    AnotherCode();
}

Вся программа останавливается, код после await в CreateSession никогда не достигается, AnotherCode () никогда не вызывается, и даже если я добавлю обработчик для необработанного исключения, он не уловит никакой ошибки.

Мои вопросы:

  • Почему программа останавливается, когда reject () не вызывается?
  • Если это ошибка, почему она не вызывается обработчиком для необработанных исключений?
  • Как игнорировать ошибку, когда в обещании не выполняется код?

Ответы [ 2 ]

2 голосов
/ 19 января 2020

Почему программа останавливается, когда reject () не вызывается?

Из-за await. Программа ожидает обещание либо resolve, либо reject. Он не может каким-то образом определить, что код внутри конструктора обещания завершил выполнение (даже если он мог бы - каково должно быть «стандартное» поведение?), И больше нет кода, который должен прийти.

Из MDN :

Функция asyn c может содержать выражение await, которое приостанавливает выполнение функции asyn c для ожидания разрешенного разрешения Promise, а затем возобновляет асинхронное выполнение. c Выполнение функции и оценка как разрешенное значение.

Для некоторого понимания «под капотом», возможно, вы захотите взглянуть на код ES5, сгенерированный такими транспортерами, как Babel (IIR C it для этого используются генераторы).

Если это ошибка, почему она не вызывается обработчиком для необработанных исключений?

Программа не знает, что error является ошибкой, если она не была выброшена или передана с использованием reject.

Как игнорировать ошибку, когда в обещании не выполняется код?

Либо resolve (instea d из reject) или reject и сделайте классическую попытку / поймать код await

1 голос
/ 19 января 2020

Для начала вы смешиваете 2 понятия, которые достигают одного и того же, создания Обещания. Вы смешиваете async/await и new Promise.

Это фактически делает вас похожими на двух связанных Обещаний.

Почему программа останавливается, когда reject () не вызывается?

Поскольку вы возвращаете Обещание, а это само по себе требует, чтобы были вызваны обратные вызовы для разрешения или отклонения.

Если ошибка вызвана тем, что она не вызывается обработчик необработанных исключений?

Фактической ошибки нет, единственное, что происходит, - это то, что ваше условие if не выполнено.

Как игнорировать ошибка, когда обещание не может выполнить свой код?

Опять же, обещание не перестает запускать свой код, вы не понимаете концепцию.

Чтобы упростить его либо используйте что-то вроде:

function CreateSession(){
   return new Promise((resolve, reject) => {
      if( <yourconditionhere> ){
         resolve(res);
      }else{
         reject(error);
      }
   });
}


CreateSession
.then((res) => {
   // code to execute in case of success (resolve)
   // receiving as argument the argument of the resolve call.
   AnotherCode();
})
.catch( error => {
   // code to execute in case of non-success (reject)
   // receiving as argument the argument of the reject call.
});

или

async function CreateSession(){
   let res = await request(options, function (error, response, body) {
      if( <yourconditionhere> ){
         return ...;
      }else{
         return ...;
      }
   }
   return res;
}

async function MyFunction()
{
    var sessionId = await CreateSession();
    AnotherCode();
}

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