拒绝包装承诺

时间:2019-03-15 00:35:16

标签: node.js promise

我怀疑代码有问题,最有可能在catch部分中,这完全使服务器应用程序崩溃。

目标:基本上检查例如实体不存在时可以处理的错误的类型,对于所有其他错误,请在不使应用程序崩溃的情况下将它们优雅地返回给调用方。 / p>

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 :(得分:0)

相同的代码,但被重写。

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()时,都会返回一个新的Promise,这与您要从函数中返回的Promise相同。

这里是异步/等待版本,只是为了好玩:

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;
    }
  }
}