Как я могу передать ошибку на многократное обещание? - PullRequest
0 голосов
/ 03 января 2019

Итак, в основном я пытаюсь создать обработчик ошибок, передавая значение ошибки, которое в моем случае представляет собой число для кода состояния, например 400, 500 и т. Д. Теперь проблема в том, когда catch перехватывает ошибку, котораясодержит значение кода состояния, возвращенного из предыдущего обещания.Когда я записываю значение, оно записывает значение правильно, но когда я отклоняю его и передаю значение, чтобы оно было поймано в catch следующего обещания, оно говорит, что значение не определено.

Вот ошибкакод:

UnhandledPromiseRejectionWarning: RangeError [ERR_HTTP_INVALID_STATUS_CODE]: недопустимый код состояния: не определено

JS:

const findFromModel = async (model, query) => {
    return new Promise((resolve, reject) => {
        model = model instanceof Object ? model : {};
        if (model) {
            model.findOne(query, (err, obj) => {
                if (obj) {
                    resolve(obj);
                } else {
                    reject(400);
                }
            });
        } else {
            reject(400);
        }
    });
}

const makeOrder = async (title, body, userQuery) => {
    return new Promise((resolve, reject) => {
        title = (typeof title === 'string' && title.length > 0) ? title : '';
        body = (typeof body === 'string' && body.length > 0) ? body : '';
        if (title && body) {
            findFromModel(userModel, userQuery)
                .then(user => resolve(user))
                .catch(err => {
                    console.log(err); // logs 400
                    reject(err); // Undefined
                });
         } else {
             reject(400);
         }
    });
}

Выполнить обещание:

1015 *

Я просто перехожу с es5 на es6, поэтому, если у вас появятся какие-нибудь более совершенные идеи по улучшению моего кода, это будет чрезвычайно оценено.

1 Ответ

0 голосов
/ 03 января 2019

Если вы хотите использовать функцию async, вы можете уменьшить свой код больше.

Promise ошибка станет исключением, поэтому используйте try...catch для ее устранения.

Возврат из async Функция эффективно resolve Обещание, бросить ошибку эффективно reject Это. (как будто они в Promise)

const makeOrder = async (title, body, userQuery) => {
  title = (typeof title === 'string' && title.length > 0) ? title : '';
  body = (typeof body === 'string' && body.length > 0) ? body : '';
  if (title && body) {
    try{
      let user = await findFromModel(userModel, userQuery)
      return user
    }catch(err){
      console.log(err); // logs 400
      throw err;
    }
    throw 400;
  }
}

даже если вы хотите использовать старые способы, обычно это делается с помощью

return findFromModel(userModel, userQuery)
   .catch(err => {console.log(err); throw err;});
...