如何在 async/await 语法中拒绝?

2023-12-01

我如何拒绝由 a 返回的承诺async/await功能?

例如起初:

foo(id: string): Promise<A> {
  return new Promise((resolve, reject) => {
    someAsyncPromise().then((value)=>resolve(200)).catch((err)=>reject(400))
  });
}

翻译成async/await:

async foo(id: string): Promise<A> {
  try{
    await someAsyncPromise();
    return 200;
  } catch(error) {//here goes if someAsyncPromise() rejected}
    return 400; //this will result in a resolved promise.
  });
}

那么,在这种情况下,我该如何正确拒绝这个承诺呢?


你最好的选择是throw an Error包装该值,这会导致拒绝的承诺Error包装值:

} catch (error) {
    throw new Error(400);
}

你也可以只throw值,但没有堆栈跟踪信息:

} catch (error) {
    throw 400;
}

或者,返回一个被拒绝的承诺Error包装该值,但这不是惯用的:

} catch (error) {
    return Promise.reject(new Error(400));
}

(要不就return Promise.reject(400);,但同样,没有上下文信息。)

在你的情况下,当你使用TypeScript and foo的返回值为Promise<A>,你会用这个:

return Promise.reject<A>(400 /*or Error*/ );

In an async/await在这种情况下,最后一个可能有点语义不匹配,但它确实有效。

如果你抛出一个Error,这与任何消耗你的东西都能很好地配合foo的结果是await syntax:

try {
    await foo();
} catch (error) {
    // Here, `error` would be an `Error` (with stack trace, etc.).
    // Whereas if you used `throw 400`, it would just be `400`.
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 async/await 语法中拒绝? 的相关文章

随机推荐