Javascript JS/TS-在异步函数中返回承诺解析/拒绝的值

Javascript JS/TS-在异步函数中返回承诺解析/拒绝的值,javascript,node.js,typescript,promise,Javascript,Node.js,Typescript,Promise,我在代码中使用的函数定义是一个异步函数,它通过try/catch从Promise返回值。类似这样的: async someFunction(参数){ 返回新承诺(异步(解析、拒绝)=>{ 试一试{ //使用wait执行类似于api调用的操作,并解析响应 解析(参数); }捕获(错误){ 拒绝(错误); } }); } someFunction(“你好世界”) 我想问,这是不是太过分了?我在写冗余代码吗?这是反模式吗 是的,这太过分了,至少有两个,也许三个反模式 您不需要声明一个函数async,

我在代码中使用的函数定义是一个异步函数,它通过try/catch从Promise返回值。类似这样的:

async someFunction(参数){
返回新承诺(异步(解析、拒绝)=>{
试一试{
//使用wait执行类似于api调用的操作,并解析响应
解析(参数);
}捕获(错误){
拒绝(错误);
}
});
}
someFunction(“你好世界”)
我想问,这是不是太过分了?我在写冗余代码吗?这是反模式吗

是的,这太过分了,至少有两个,也许三个反模式

您不需要声明一个函数
async
,它只是从中返回一个手动创建的承诺。而且,您也不需要将promise executor回调声明为
async
。而且,如果您在executor中使用
wait
,则不需要用手动创建的承诺来包装它

如果您确实计划在promise executor中使用
await
,那么您必须已经有了返回您想要使用
await
的承诺的函数。如果是这样的话,那么就没有理由将它们包装在手动创建的承诺中。这是一种反模式的承诺

您也不需要尝试/捕获,然后以相同的错误拒绝。您可以让错误自行传播

因此,假设您有两个promise-returning函数,希望使用
wait
连续运行。那么,您所需要的就是:

async function someFunction(parameters) {

    let v1 = await func1(...);
    // do something with v1
    let v2 = await func2(someValFromV1);
    // do something with v2
    return someValFromV2;
}

someFunction("HEllo world").then(result => {
    console.log(result);
}).catch(err => {
    console.log(err);
});
或者您可以使用
wait
而不是
调用它。然后()


取决于
做点什么
@CertainPerformance更新了代码。是的,至少有两种反模式。您不需要声明一个函数
async
,它只是从中返回一个手动创建的承诺。而且,您也不需要将promise executor回调声明为
async
。而且,如果您在执行器中使用
await
,则不需要用手动创建的承诺将其包装。@jfriend00如果我在其他地方使用await调用此函数该怎么办?请参阅下面的答案。正如我在上面所评论的,如果我在其他地方使用await调用此函数该怎么办?然后我应该将函数定义为async,对吗?此外,我在someFunction中执行与DB(大多数DB ORM函数返回承诺)或外部API调用相关的任务,如果函数失败,我需要返回错误。那样的话我该怎么办?作为参考,我正在制作一个web应用程序,我需要显示响应中返回的错误或值。@Gabriel-我的回答已经显示在最后使用
wait
调用它。用文字描述的这种假设性的东西很难做出好的答案。如果您需要更具体的帮助,那么向我们展示您的真实代码,我们将能够为您提供非常具体(可能是有帮助的)的建议。编写异步代码的最佳方法总是具体到您正在做的事情,并且需要一本书来涵盖所有理论上的可能性。但是,如果您向我们展示一段特定的实际代码,我们可以很容易地向您展示一个好方法。@Gabriel-我所有的示例都会通过返回的承诺自动传播错误。
await
错误上被拒绝的承诺会导致从
async
函数返回的承诺自动被拒绝,并且调用者看到该拒绝时会出现相应的错误。只有当您想要截获错误并在错误发生时执行一些特殊操作时,才需要在本地捕获错误,而不是让它自然地传播回调用方。真正的代码更容易讨论。
async function anotherFunction() {
    let result = await someFunction(...);
    // do something with result
}