繁体   English   中英

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

[英]Throw Error with loop of await function

我正在努力与异步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 ... in或在try catch await addValue但没有捕获到错误

因此,我有两个问题:

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

谢谢你的帮助 :)

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

您的代码已经通过await addValue 如果addValue引发错误,因为addMulti不能catch ,它addMulti终止addMulti

问题是,当我调用addMulti时,如果出现错误,则显示UnhandledPromiseRejectionWarning。

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

  • 处理错误(如果不想传播它,可以try / catch async函数,如果直接使用promise,则可以通过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)似乎很奇怪; 只是让错误传播。

当您使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')
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM