同一文件中Promise是否顺序执行?异步函数多次调用执行顺序问询
问题描述
我有一个返回Promise的异步函数,代码如下:
public async a(): Promise<string> { return 'hi' }
在另一个文件中我通过如下方式调用该函数:
await service.a.then(hi => console.log(hi)).catch(err => { throw err }); await service.a.then(hi => console.log(hi)).catch(err => { throw err });
请问这两次调用是否会依次执行,且不存在交互问题?
回答
这两次调用会依次执行,而且不存在交互问题,具体说明如下:
- 首先要纠正一个代码小问题:你写的
service.a.then是错误的,应该调用函数service.a()才能得到Promise,否则是直接对函数对象调用.then,会触发报错。假设修正为service.a()的话—— - 每次调用
service.a()都会生成一个全新的Promise实例,两个实例之间完全独立,不会共享任何状态,自然不存在交互干扰的问题。 - 代码里的两个
await是串行执行的:第一个await会等待第一个Promise完成(无论是成功resolve还是失败reject),之后才会执行第二行的await调用,所以两次调用是严格按顺序执行的。 - 另外你代码里的
.catch(err => { throw err })其实是多余的,因为await本身就会把Promise的reject状态转化为抛出的异常,不过这部分不影响执行顺序和调用独立性。
内容的提问来源于stack exchange,提问作者AkiZukiLenn
相关产品推荐
相关产品推荐

