正确使用Promises和错误处理

时间:2018-03-16 16:51:00

标签: javascript angular typescript

我的任务是使用angular编写WebApp,其中存在原型。由于我没有使用Typescript和异步编程的经验,我不确定如何以最佳方式处理它。

在原型中执行握手,这是一系列计算和HTTP请求。所有函数(甚至是那些只计算某些函数的函数)都返回一个包含函数的Promise,并因此解析或拒绝。

这些函数组合在一个.then的长链中,它也处理错误。这看起来很奇怪,我不确定,引擎盖下到底发生了什么:

this.startHandshake()
  .then((buf) => this.calculateSomthing(buf)
    .then((buf2) => http.sendData(buf2)
       ..., // this goes on many levels
    (e:Error) => this.handleError(e)),
  (e:Error) => this.handleError(e))
.catch((e: Error) => { /* Error Handling */ });

我的问题是:

  1. 这种代码模式对于这类问题是否常见?
  2. 我读到Promise是以单线程方式处理的。对于只计算某些东西的Promise来说这意味着什么(没有http请求,没有定时器)? Promise中的函数何时执行?它是立即的,在原始代码完成时放入队列,还是调度这两行执行的javascript引擎?
  3. 我更愿意同步编写一些函数,但后来我需要一种处理错误的方法。最明显的例外 - 似乎并不能很好地兑现承诺。
  4. 在我的情况下是否可以使用async / await来使代码更具可读性?如何处理错误?是否可以与例外相结合?

3 个答案:

答案 0 :(得分:0)

我建议您阅读有关承诺以及如何使用它们的更多内容,但无论如何,您的问题:

this.startHandshake()
      .then((buf) => this.calculateSomthing(buf))
      .then((buf2) => http.sendData(buf2))
      .then(() => {all the reset} )
      .catch((e: Error) => { ... });
  1. 是和不,通常你会希望一个接一个地保留承诺,而不是在里面,所以你的代码应该是这样的:

  2. 发生了什么内部承诺是同步的,承诺之间发生的是异步

  3. 正如我之前所说,你可能只是将同步代码放在promise中,关于你可能需要阅读的关于Promise.reject的错误处理,女巫让你能够手动拒绝承诺

  4. async \ await与Promise完全相同,它是唯一的糖语法。我更喜欢async \ await语法,但项目的设置需要更多关注(Promise内置于大多数浏览器中,async await isn&t;)

  5. 修改:有些东西不能使用代码格式化,所以我把它移到问题的上方

    祝你好运!

答案 1 :(得分:0)

阅读callback hell可以为您提供有关如何解决嵌套问题的一些见解。

答案 2 :(得分:0)

假设您有多个函数,每个函数都返回一个Promise

f1(p1: any):Promise<any> {}
f2(p2: any):Promise<any> {}
f3(p3: any):Promise<any> {}

如果你想链接你的所有方法并一个接一个地执行,最好的方法(在我看来)写的是这样的

const p1 = {} // my firt parameter
f1(p1).then((result)=>f2(result))

一旦调用then方法

,您的代码就会被执行

要处理您使用的所有方法中的所有错误,您应该在调用catch后使用then方法

f1(p1).then((result)=>f2(result)).catch((err:Error)=>{ /** do something*/ })

我的情况是你要管理来自你的一个功能的特定错误然后我建议你做这样的事情

 f1(p1).then((result)=>f2(result).catch((err)=>Promise.resolve(optionalResult))).catch((err:Error)=>{ /** do something*/ })

这个过程不会扼杀你的链条,并将继续其余的方法

其他人认为你可以做的是使用像{/ p>这样的Promise.all()方法并行执行promises

Promise.all([f1(p1), f2(p2), f3(p3)]).then((results:any[])=>{ ...})

此函数将返回包含所有结果的数组

如果您想抛出错误或只是停止链,您可以使用  Promise.reject方法