如何在 Promise 内部返回错误?

huangapple go评论77阅读模式
英文:

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 &quot;fmt&quot;

func exitForLoopWithError(err error) error {
  for i := 0; i &lt; 10; i++ {
    if err != nil {
      return err
    }
  }
return nil
}

func main() {
  err := fmt.Errorf(&quot;An error occurred&quot;)
  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, &amp;record, func(r *kgo.Record, err error) {
           
            if err != nil {
                fmt.Printf(&quot;record had a produce error: %v\n&quot;, err)
                
                // How do I return an error here and exit sendAll function?
                loop = err
            }
        })
    }
    return loop
}

huangapple
  • 本文由 发表于 2023年1月26日 04:53:58
  • 转载请务必保留本文链接:https://go.coder-hub.com/75239746.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定