[英]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.