处理承诺拒绝的TypeScript语法

处理承诺拒绝的TypeScript语法,typescript,promise,Typescript,Promise,我知道被拒绝的承诺应该通过错误处理来处理 但是,我怀疑此代码将不起作用: public myFunction(): Promise<number> { try { return this.doThingAsync(...); //Returns a promise } catch (e) { return Promise.resolve(7); //Fallback value } } 既然第一次返回立即返回承诺,那么try/catch就没有机会处理承诺

我知道被拒绝的承诺应该通过错误处理来处理

但是,我怀疑此代码将不起作用:

public myFunction(): Promise<number>
{
  try {
    return this.doThingAsync(...); //Returns a promise
  } catch (e) {
    return Promise.resolve(7); //Fallback value
  }
}
既然第一次返回立即返回承诺,那么try/catch就没有机会处理承诺被拒绝的情况,这不是真的吗

实际上,引发错误的异步部分不会在该函数的执行上下文中运行,因此
try
块不适用于该异步代码

async
/
await
解决方案将恢复该函数执行上下文(这是
await
的神奇之处),然后错误将在
try…catch
上下文中处理。但是在正常函数中没有这样的执行上下文恢复,因此在出错时,
try…catch
上下文不存在

下面是一个示例,承诺在100毫秒后拒绝。第一个函数具有与开始时相同的模式。它不会看到错误,因此会出现“未捕获的承诺拒绝”(堆栈片段不会显示这一点,但它在浏览器控制台中)

//助手函数:
const delay=ms=>newpromise(resolve=>setTimeout(resolve,ms));
const delayAndError=ms=>delay(ms)。然后(()=>{抛出“我的错误”});
函数myFunction(){
试一试{
返回延迟错误(100);
}捕获(e){
回报承诺。决心(7);//永远不会发生
}
}

myFunction().then(console.log);//这一承诺将被拒绝;因此没有输出
事实上,在
try
/
catch
中返回承诺不会处理该承诺的未来拒绝

简单地将方法切换到
async
也不会奏效。要正确处理错误/拒绝,您需要执行以下操作之一

使用
等待

等待承诺可以确保控件在终止之前返回到方法,从而给它一个处理错误的机会。请注意,这需要将方法/函数标记为
async

public async myFunction(): Promise<number>
{
  try {
    const result = await this.doThingAsync(...);
    return result;
  } catch (e) {
    return 7; //Fallback value
  }
}

使用
async
注释函数时,它隐式返回一个承诺。您的函数不是异步的,因此必须显式返回一个。你不需要等待,只要回复承诺就可以了仅仅因为某些东西已经存在了一段时间,并不意味着应该避免它。您仍在使用
return
,这一功能将永远存在!TypeScript是JavaScript的超集;这意味着TypeScript中总会有来自JavaScript的语法。事实上,这里显示的代码中唯一在JavaScript(ES2020)中无效的东西是
public
:Promise
“我怀疑这段代码不起作用”:为什么不先测试一下呢?然后,您会发现它起作用或不起作用,您可以询问一些与您实际运行的代码相关的问题。@Sildoreth拒绝会导致使用
wait
时出现异常,是的,但这不是TypeScript特有的功能。我倾向于关闭,因为TypeScript中的
承诺拒绝的副本会导致异常,可以使用try/catch处理。不,它们不会。Typescript是一个静态类型系统。它逐渐消失了。它在运行时不存在,所以它不能像Javascript那样“处理承诺”,事实上它在运行时根本不处理值。这与Typescript有关的唯一原因是编译器(正确地)警告您,您认为从函数返回的内容并不是所有情况下实际返回的内容。嗯,为什么要重复1小时前给出的答案?在发布之前,我已经在写答案了。我现在正在工作,所以我在这和会议之间切换。:)当我接到电话时,我已经把答案写好了,但没有校对过。
public async myFunction(): Promise<number>
{
  try {
    const result = await this.doThingAsync(...);
    return result;
  } catch (e) {
    return 7; //Fallback value
  }
}
public myFunction(): Promise<number>
{
    return this.doThingAsync(...).catch(() =>
    {
      return 7; //Fallback value
    }
}