带有等待功能循环的抛出错误

时间:2018-07-19 08:29:15

标签: javascript node.js typescript loops async-await

我正在努力处理异步等待功能的循环。我正在创建一个将请求发布到另一个API的API。我必须进行循环,因为用户可以一次在数据库中插入许多项目。

我调用的API拒绝并行执行,因此我不能使用Promise.all:/

为了实现该服务,我制作了一个函数来插入一个对象:

const addValue = async (ID:number, cookie: string) => {
    try {
        const addValueBody = await addValueQuery(ID:number)
        const header = { 'cookie': cookie, 'content-type': 'application/json' }
        const fetchResult = fetch('http://api-to-call.xyz', { method: `POST`, headers: header, body: addValueBody })
        const response = await fetchResult
        const jsonData = await response.json()
        return jsonData
     } catch (e) {
        throw Error(e.message)
    }
}

还有一个将在for循环内执行addValue的函数:

const addMulti = async (values: any, cookie: string) => {
    for (const item of values) {
           await addValue(item.ID, cookie)
    }
}

问题在于,当我调用addMulti时,如果出现错误,我将得到一个UnhandledPromiseRejectionWarning

我也尝试将de for ... inawait addValue放在try catch内,但没有捕获到错误

因此,我有2个问题:

如果在执行循环期间发生错误,如何抛出en错误? 如果有错误,是否可以中断循环?

感谢您的帮助:)

2 个答案:

答案 0 :(得分:3)

  

如果在执行循环期间发生错误,如何抛出en错误?如果有错误,是否可以中断循环?

您的代码已经通过awaitaddValue来做到这一点。如果addValue引发错误,因为addMulti不会catch,它也会终止addMulti

  

问题是,当我调用addMulti时,如果出现错误,我将收到一个UnhandledPromiseRejectionWarning。

您显示的代码是正确的¹,问题是看来您对addMulti的调用没有错误处理。该代码必须:

  • 如果不想让它传播,则通过try函数中的catch / async处理错误(如果您不希望传播它,则通过catch方法)直接使用承诺),或者
  • 将错误传播到可以解决错误的地方(通过不在async函数中捕获错误,或通过在非async函数中返回promise)

例如,如果对addMulti的调用是在非async函数中,并且没有任何调用该函数的错误,那么您需要在该阶段进行处理:

addMulti(/*...*/)
    .catch(error => {
        // ...handle/report the error
    });

如果它在async函数中,但是没有任何东西可以处理该async函数的错误,则:

try {
    await addMulti(/*...*/);
} catch (e) {
     // ...handle/report the error
}

¹...除了抓e然后再做throw Error(e.message)似乎很奇怪;只是让错误传播。

答案 1 :(得分:0)

UnhandledPromiseRejection使用异步函数时,几乎可以肯定地意味着您没有捕获引发的错误。在您的情况下,您可以将整个循环包装在try{...} catch{...}块中:

const addMulti = async (values: any, cookie: string) => {
    try {
        for (const item of values) {
           await addValue(item.ID, cookie)
       }
    } catch(e) {
        console.log('Error occured in async function')
    }
}