отвергая обещание обертки - PullRequest
0 голосов
/ 15 марта 2019

Я подозреваю, что есть какая-то проблема с кодом, и, скорее всего, в той части catch, которая в целом приводит к сбою серверного приложения.

Цель : в основном проверка типа ошибки, которая может быть обработана, например, если сущность не существует, для всех остальных ошибок изящно отклонить их обратно вызывающей стороне без сбоя приложения.

const Article = require("Article");

function upload(row) {
    return new Promise(function(resolve, reject){

        Article.requestData(row.schema) // if exists
            .then(Article.upload.bind(null, row.article)) //may throw error
            .then(resolve) // done if OK
            .catch(function(error){
                if(error.code == "NotFoundException") { // entity doesn't exists
                    Article.create(row.schema) // create entity
                        .then(Article.upload.bind(null, row.article)) // upload
                        .then(resolve, reject); // reject upload error
                } else { // upload errors
                    // reject(error); // tried reject
                    throw error; // trying re-throw
                }
            });
    });
}

Код сначала пытается получить информацию о сущности, а если она не найдена, он создает ее.

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

Я получаю ошибку UnhandledPromiseRejectionWarning

1 Ответ

0 голосов
/ 15 марта 2019

Тот же код, но переписан.

function upload(row) {

   return Article.requestData(row.schema) // if exists
     .then(Article.upload.bind(null, row.article)) //may throw error
     .catch(function(error){
        if(error.code == "NotFoundException") { // entity doesn't exists
           return Article.create(row.schema) // create entity
             .then(Article.upload.bind(null, row.article)) // upload
        } else {
            throw error;
     });
}

Бег new Promise() часто называют людьми анти-паттерном.Иногда вы не можете легко обойти это, но это типичный случай, когда он совершенно не нужен.

Каждый раз, когда вы звоните .then() или .catch(), возвращается новое обещание, и это то же самое обещаниеВы хотите вернуться из своей функции.

Вот асинхронная / ожидающая версия, просто для удовольствия:

async function upload(row) {

  try {
    await Article.requestData(row.schema) // if exists
    await Article.upload.bind(row.article);
  } catch (error) {

    if(error.code == "NotFoundException") { // entity doesn't exists
       await Article.create(row.schema) // create entity
       await Article.upload(row.article);
    } else {
       throw error;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...