千家信息网

Java循环内的回调函数问题怎么解决

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,本篇内容介绍了"Java循环内的回调函数问题怎么解决"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问
千家信息网最后更新 2026年11月02日Java循环内的回调函数问题怎么解决

本篇内容介绍了"Java循环内的回调函数问题怎么解决"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

问题出现在循环体内的回调函数,用一个很简单的例子举例:

  for x in xrange(3):

1.

  print "requests begin:%s"%x

2.

  def callback(respon):

3.

  print x

4.

  print respon.body

5.

  client.fetch("http://httpbin.org/get?x=%s" % x, callback)


  此例子忽略了等待回调函数完成的wait实现(不实现这个会导致作为单个文件运行的时候,还没获得结果就退出了),在tornado.testing中的AsyncTestCase提供了相关功能
  httpbin.org/get这个地址的作用是返回了请求的json对象,形如:
  {

1.

  "args": {

2.

  "x": "0"

3.

  },

4.

  "headers": {

5.

  "Accept-Encoding": "gzip",

6.

  "Connection": "close",

7.

  "Host": "httpbin.org",

8.

  "X-Request-Id": "95df3c15-7ed0-4a6d-830d-fb9629e66515"

9.

  },

10.

  "origin": "192.81.129.91",

11.

  "url": "http://httpbin.org/get?x=0"

12.

  }


  但实际上,由于回调函数特殊的特性:访问闭包内局部变量的当前值。易知,在第一个请求
  http://httpbin.org/get?x=0的url返回时,循环早已结束,此时的x已经为2,因此实际上虽然httpbin.org返回的json告诉我们,get参数里的x为0,但闭包内访问到的x已经是2了
  解决方法我想了两个,一个是利用回调函数构造时的变量空间,在构造函数时即产生这个参数,形如:
  client = AsyncHTTPClient(self.io_loop)

1.

  for x in xrange(3):

2.

  def callback(respon,num=x):

3.

  print x, num

4.

  print respon.body

5.

  if num == 2:

6.

  self.stop()

7.

  client.fetch("http://httpbin.org/get?x=%s" % x, wrap(x))


  一种是再包一层闭包(这层闭包也可以放在for外面):
  client = AsyncHTTPClient(self.io_loop)

1.

  for x in xrange(3):

2.

  def wrap(number):

3.

  num = number

4.

  def callback(respon):

5.

  print x, num

6.

  print respon.body

7.

  if num == 2:

8.

  self.stop()

9.

  return callback

10.

  client.fetch("http://httpbin.org/get?x=%s" % x, wrap(x))

11.

  #wrap放在for外面:

12.

  client = AsyncHTTPClient(self.io_loop)

13.

  def wrap(number):

14.

  num = number

15.

  def callback(respon):

16.

  print x, num

17.

  print respon.body

18.

  if num == 2:

19.

  self.stop()

20.

  return callback

21.

  for x in xrange(3):

22.

  client.fetch("http://httpbin.org/get?x=%s" % x, wrap(x))


  思索了一下,闭包的内存占用问题应当是不可避免的?当循环体的每一项(x)是一个大内存对象时,内存占用等同于不用迭代器用列表进行循环,除了这两种不知道还有没有更优雅的解决方案。

"Java循环内的回调函数问题怎么解决"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

函数 循环 闭包 问题 实际 例子 内存 内容 参数 变量 实际上 对象 循环体 更多 知识 实用 特殊 优雅 不可避免 学有所成 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 疫情对互联网科技公司影响 互联网中国科技 互联网科技战争 迪茉互联网科技 丰台科技园 互联网 互联网实体化科技化 济南华为互联网科技产业总部基地 中国科技互联网公司收入 央行互联网金融科技公司 顶级互联网科技成果有哪些 互联网保险科技创业 乌苏新华互联网科技做什么的 徐州市互联网科技有限公司 深圳无忧互联网科技 广州百诚互联网科技有限公司官网 工业互联网科技创业 新氧科技和美国互联网有关系吗 互联网金融运营模式中的金融科技 广东猫王互联网科技有限公司电话 现代科技的标志之一的互联网 新华互联网科技 云之行互联网科技 互联网金融科技平台 广州紫鲸互联网科技 互联网科技大会案例 银川新华互联网科技职业技术培训学校图片 互联网科技产业特征 朱啸虎曾投资哪些互联网科技企业 保山浩联互联网科技有限公司 河南商务圈互联网科技有限公司
0