Обработка PromiseRejection в node.js

Я только начал работать с JavaScript в первый раз. Из поиска в Google я смог найти примеры обработки отклонения обещаний только через функции, которые вы написали. Моя проблема в том что

app.getInput("key");

не написано мной. Я хочу быть в состоянии обработать отклоненное обещание в моем коде. Мой мозг испытывает проблемы с "получением JavaScript" в данный момент.

У меня есть эта функция (в рамках jovo)

var content = app.getInput('content');

Я получаю сообщение об ошибке "Ошибка типа: не удается прочитать свойство" содержание "неопределенного". Я знаю, почему я получаю эту ошибку, я просто хочу иметь возможность справиться с ситуацией, когда нет контента.

Он также говорит: "UnhandledPromiseRejectionWarning: необработанное отклонение обещания"

Я просто хочу иметь возможность написать что-то вроде

var content = "null";

content = testFunc().then(() => {
    console.log('resolved content!');
}).catch((err) => {
    console.log('error content');
    content = "null";
});

function testFunc(){
    return app.getInput('content');
}

3 ответа

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


Оберните это с помощью try / catch

let content;

try {
   content = app.getInput('content');

   // All is ok there

   ...
} catch (err) {
  ...
}


@ Габриэль Блю

function a() {
  throw new Error('Error');
}

async function testFunc() {
  try {
    const content = a();
    
    console.log('No error');
    
    return content;
  } catch(err) {
    console.log('Error');
  
    return null;
  }
}

testFunc();

Самый простой способ справиться с обещанием - использовать async/await

async function testFunc() {
  try {
    const content = await app.getInput('content');
    return content;
  } catch(err) {
    return null;
  }
}

Из вашего описания и из JOVO документов, я понимаю, что getInput() это синхронный метод. Ошибка TypeError: Cannot read property 'content' of undefined бросается звонящему (ваш код). Похоже, что фреймворк не инициализирован должным образом, undefined вещь заставляет меня верить в это.

Как Grégory NEUT ответил ранее, вы используете try/catch блок, чтобы справиться с этим.

try {
  content = app.getInput('content');

  // All is ok there
} catch (err) {
  // content is unavailable, inspect the error
}

Другая проблема, "UnhandledPromiseRejectionWarning: Unhandled promise rejection" происходит, когда обещание отклонено и не выполнено. Возможно, try/catch решил бы это, но, возможно, нет. Дело в том, что когда вы звоните testFunc() и он терпит неудачу, он не возвращает отклоненное обещание, поэтому у него не будет метода .then() как ты и ожидал. Gabriel Bleu Решение будет гарантировать, что вы получите обещание в любом случае.

Другие вопросы по тегам