我正在努力处理异步等待功能的循环。我正在创建一个将请求发布到另一个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
或await addValue
放在try catch
内,但没有捕获到错误
因此,我有2个问题:
如果在执行循环期间发生错误,如何抛出en错误? 如果有错误,是否可以中断循环?
感谢您的帮助:)
答案 0 :(得分:3)
如果在执行循环期间发生错误,如何抛出en错误?如果有错误,是否可以中断循环?
您的代码已经通过await
到addValue
来做到这一点。如果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')
}
}