我的任务是使用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 */ });
我的问题是:
答案 0 :(得分:0)
我建议您阅读有关承诺以及如何使用它们的更多内容,但无论如何,您的问题:
this.startHandshake()
.then((buf) => this.calculateSomthing(buf))
.then((buf2) => http.sendData(buf2))
.then(() => {all the reset} )
.catch((e: Error) => { ... });
是和不,通常你会希望一个接一个地保留承诺,而不是在里面,所以你的代码应该是这样的:
发生了什么内部承诺是同步的,承诺之间发生的是异步
正如我之前所说,你可能只是将同步代码放在promise中,关于你可能需要阅读的关于Promise.reject的错误处理,女巫让你能够手动拒绝承诺
async \ await与Promise完全相同,它是唯一的糖语法。我更喜欢async \ await语法,但项目的设置需要更多关注(Promise内置于大多数浏览器中,async await isn&t;)
修改:有些东西不能使用代码格式化,所以我把它移到问题的上方
祝你好运!
答案 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
方法