正确尝试...使用Async / Await捕获语法

问题描述 投票:39回答:3

我喜欢在Typescript等中提供的新Async/Await功能的平坦性。但是,我不确定我喜欢这样的事实,我必须在await块的外面声明变量我是try...catching以便以后使用它。像这样:

let createdUser
try {
    createdUser = await this.User.create(userInfo)
} catch (error) {
    console.error(error)
}

console.log(createdUser)
// business
// logic
// goes
// here

如果我错了,请纠正我,但似乎最好不要在try体中放置多行业务逻辑,所以我只留下在块外声明createdUser的替代方案,在块中分配它,然后使用它。

在这种情况下,最佳做法是什么?

javascript promise async-await try-catch ecmascript-2017
3个回答
38
投票

似乎最好不要在try体中放置多行业务逻辑

其实我会说是的。您通常希望catch使用该值的所有异常:

try {
    const createdUser = await this.User.create(userInfo);

    console.log(createdUser)
    // business logic goes here
} catch (error) {
    console.error(error) // from creation or business logic
}

如果您只想从承诺中捕获并处理错误,您有三种选择:

  • 在外部声明变量,并根据是否存在异常进行分支。这可以采取各种形式,如 为catch块中的变量分配默认值 return早期或重新throw来自catch区块的例外 设置一个标志catch块是否捕获异常,并在if条件下测试它 测试已分配的变量的值 let createdUser; // or use `var` inside the block try { createdUser = await this.User.create(userInfo); } catch (error) { console.error(error) // from creation } if (createdUser) { // user was successfully created console.log(createdUser) // business logic goes here }
  • 测试捕获的异常的类型,并根据它处理或重新抛出它。 try { const createdUser = await this.User.create(userInfo); // user was successfully created console.log(createdUser) // business logic goes here } catch (error) { if (error instanceof CreationError) { console.error(error) // from creation } else { throw error; } } 不幸的是,标准JavaScript(仍然)没有conditional exceptions的语法支持。
  • 使用then with two callbacks而不是try / catch。这实际上是最不丑的方式,也是我个人的建议,因为它的简单性和正确性,不依赖于标记的错误或结果值的外观来区分履行的履行和拒绝: await this.User.create(userInfo).then(createdUser => { // user was successfully created console.log(createdUser) // business logic goes here }, error => { console.error(error) // from creation }); 当然它带有引入回调函数的缺点,这意味着你不能轻易地从外部函数break / continue循环或做早期的returns。

7
投票

另一种更简单的方法是将.catch附加到promise函数。例如:

const createdUser = await this.User.create(userInfo).catch( error => {
// handle error
})

0
投票

@Bergi答案很好,但我认为这不是最好的方法,因为你必须回到旧的then()方法,所以我认为更好的方法是捕获异步函数中的错误

async function someAsyncFunction(){
    const createdUser = await this.User.create(userInfo);

    console.log(createdUser)
}

someAsyncFunction().catch(console.log);
  • 但是,如果我们在同一个函数中有许多await并需要捕获每个错误呢?

您可以声明to()函数

function to(promise) {
    return promise.then(data => {
        return [null, data];
    })
    .catch(err => [err]);
}

然后

async function someAsyncFunction(){
    let err, createdUser, anotherUser;

    [err, createdUser] = await to(this.User.create(userInfo));

    if (err) console.log(`Error is ${err}`);
    else console.log(`createdUser is ${createdUser}`);


    [err, anotherUser] = await to(this.User.create(anotherUserInfo));

    if (err) console.log(`Error is ${err}`);
    else console.log(`anotherUser is ${anotherUser}`);
}

someAsyncFunction();

读它时:“等到这个.User.create”。

最后,您可以创建模块“to.js”或只使用await-to-js模块。

您可以在to获得更多关于this post功能的信息

© www.soinside.com 2019 - 2024. All rights reserved.