英文:
How to return an error from inside a promise?
问题
我有一个函数(sendAll
),如果在kgo.Produce
(文档在这里)中出现问题,我希望它返回error
。我该如何使其停止循环并返回错误而不是继续执行?
func (k *buffer) sendAll() error {
for _, record := range k.buffer {
kgo.Produce(ctx, &record, func(r *kgo.Record, err error) {
if err != nil {
fmt.Printf("record had a produce error: %v\n", err)
// 在这里如何返回错误并退出sendAll函数?
}
})
}
return nil
}
英文:
I have a function (sendAll
) that I want to make return error
if something wrong happens in kgo.Produce
(docs here). How can I make it stop looping and returning an error instead?
func (k *buffer) sendAll() error {
for _, record := range k.buffer {
kgo.Produce(ctx, &record, func(r *kgo.Record, err error) {
if err != nil {
fmt.Printf("record had a produce error: %v\n", err)
// How do I return an error here and exit sendAll function?
}
})
}
return nil
}
答案1
得分: 0
正确的方法是在循环内返回错误。
import "fmt"
func exitForLoopWithError(err error) error {
for i := 0; i < 10; i++ {
if err != nil {
return err
}
}
return nil
}
func main() {
err := fmt.Errorf("发生了一个错误")
returnedErr := exitForLoopWithError(err)
if returnedErr != nil {
fmt.Println(returnedErr)
}
}
请注意,我只提供了代码的翻译部分,不包括其他内容。
英文:
The right way is to return the error within the loop.
import "fmt"
func exitForLoopWithError(err error) error {
for i := 0; i < 10; i++ {
if err != nil {
return err
}
}
return nil
}
func main() {
err := fmt.Errorf("An error occurred")
returnedErr := exitForLoopWithError(err)
if returnedErr != nil {
fmt.Println(returnedErr)
}
}
答案2
得分: 0
看起来你可以通过检查一个"本地"变量来解决问题。
func (k *buffer) sendAll() error {
var loop error
for _, record := range k.buffer {
if loop != nil {
break
}
kgo.Produce(ctx, &record, func(r *kgo.Record, err error) {
if err != nil {
fmt.Printf("record had a produce error: %v\n", err)
// 在这里如何返回一个错误并退出 sendAll 函数?
loop = err
}
})
}
return loop
}
英文:
Seems to me like you can get away with a simple check of a "local" variable.
func (k *buffer) sendAll() error {
var loop error
for _, record := range k.buffer {
if loop != nil {
break
}
kgo.Produce(ctx, &record, func(r *kgo.Record, err error) {
if err != nil {
fmt.Printf("record had a produce error: %v\n", err)
// How do I return an error here and exit sendAll function?
loop = err
}
})
}
return loop
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论