我正在尝试在Nottion JS SDK的iteratePaginatedAPI
上构建一个 Package 器来处理错误。我特别不知道如何捕捉API错误,以便能够实际重试它们(又名重试失败的迭代)。以下是我的尝试:
async function* queryNotion(listFn, firstPageArgs) {
try {
for await (const result of iteratePaginatedAPI(listFn, firstPageArgs)) {
yield* result
}
} catch (error) {
if (error.code === APIErrorCode.RateLimited) {
console.log('rate_limited');
console.log(error);
sleep(1);
// How would I retry the last iteration?
}
}
}
来自Ruby世界,在一个rescue
块中有一个retry
。任何帮助都将不胜感激!
2条答案
按热度按时间z9smfwbn1#
非常有趣的问题。问题是异常来自
for await
本身,而不是它的主体,所以你不能在那里捕获它。当异常命中时,循环结束。注意,迭代器可能是在拒绝/异常之后完成的,在这种情况下,除了启动一个新的迭代器之外,您什么也做不了。
也就是说,你总是可以自己调用
Iterator.next()
并手动处理结果,异步迭代器的next()
调用将返回一个类似{value: Promise<any>, done: boolean}
的对象,当在循环中运行它时,你可以等待try..catch
中的承诺,只有当done
变为true时才退出循环:如果我们保留对生成器的引用,我们也可以把它放回到
for async
中,这可能更容易阅读,但是for await ...of
会在提前退出循环时调用迭代器的return()
,很可能是结束循环,在这种情况下,将不起作用:6tr1vspr2#
只需在
if
中添加continue
语句