如果使用 then ,是不是需要在 promise 中嵌套 catch?

Posted

技术标签:

【中文标题】如果使用 then ,是不是需要在 promise 中嵌套 catch?【英文标题】:Are nested catches within promises required if then is used?如果使用 then ,是否需要在 promise 中嵌套 catch? 【发布时间】:2019-09-29 21:39:51 【问题描述】:

我想我知道了Promisethencatch 以及嵌套承诺,如Are nested catches within promises required? 所示。但是,如果我嵌套承诺并希望通过返回内部承诺来避免内部catchs,那么由于promise2 中抛出的Error,我很难让以下内容不崩溃:

function promise1(): Promise<string> 
  return new Promise(function(resolve, reject) 
    return promise2().then(promise2Result => 
      if(promise2Result !== "") 
        resolve("The value is "+promise2Result);
      else 
        reject(new Error("promise2.then error"));
      
    )
  );


function promise2(): Promise<string> 
  return new Promise(function(resolve, reject) 
    throw new Error("promise2 error");
  );

Chrome 向我展示了以 yarn run start 开头的 yarn 开发服务器的 Unhandled Rejection (Error): promise2 error。它指向promise2 中抛出的Error。 Firefox 调试器跳转到我的代码之外的随机行并且什么也不显示。

如果我在promise2().then(...) 之后添加catch,则会捕获Error

如何避免内部catch?并从promise2 中捕获Error,例如在catch

promise1()
  .then(value => alert(value))
  .catch(err => alert("err: "+err));

将每个函数体包装在 try-catch 块中并不是一种选择,因为内部 .catch(...) 已经更优雅了。

Error 的抛出只是一个最小的例子,当然,假设它是偶然发生的,并且 promise2 返回的承诺预期会做一些有用的事情并且有一个错误。

我正在寻找一种允许更深嵌套的原则,例如使用 promise2 返回 promise3 ,然后可能会像现在 promise2 那样意外抛出错误。

【问题讨论】:

【参考方案1】:

你的promise2 已经返回了一个Promise,所以不需要再次显式构造一个Promise。相反,只需链接promise2,如果它解析的值不正确,则抛出错误而不是调用reject。 (同样,不要调用resolvereturn 你希望外部 Promise 解析为的表达式)

function promise1() 
  return promise2().then(promise2Result => 
      if (promise2Result !== "") 
        return "The value is " + promise2Result;
       else 
        throw new Error("promise2.then error");
      
    )


function promise2() 
  return new Promise(function(resolve, reject) 
    throw new Error("promise2 error");
  );


promise1()
  .catch(e => console.log(e.message));

【讨论】:

以上是关于如果使用 then ,是不是需要在 promise 中嵌套 catch?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python将txt文件或PDF转换为Word doc?

word和.txt文件转html 及pdf文件, 使用poi jsoup itext心得

linux 下 pdf 转换成txt

如何使用 php 将 .docx、xslx、img、txt 等任何文件转换为 PDF 预览?

从Txt,PDf,Google云端硬盘中的Doc文件中提取电子邮件地址

如何将pdf合成制作成chm格式?