You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

for await...of循环与预取迭代器后遍历为何不等价?报错解析

为什么两段代码不等价?

核心原因是ctx.stub.getStateByRange(startKey, endKey)返回的是异步可迭代对象,而非普通同步可迭代对象,两者适用的遍历语法完全不同:

第一段代码:for await...of 适配异步迭代

for await...of是专门为异步可迭代对象设计的遍历语法,它会自动识别对象的Symbol.asyncIterator接口:

  • 每次迭代时调用异步迭代器的next()方法(该方法返回Promise)
  • 等待Promise完成后取出迭代结果
  • 直到迭代器标记为完成时终止循环
    因此这段代码能正常遍历所有键值对。

第二段代码:普通for...of不支持异步迭代器

你错误地对getStateByRange的返回值使用了await——实际上getStateByRange直接返回异步可迭代对象,而非Promise。即便用了await,最终得到的还是原异步可迭代对象,但它只实现了Symbol.asyncIterator接口,没有普通迭代器要求的Symbol.iterator接口。

普通for...of遍历对象时会查找Symbol.iterator接口,找不到就会抛出“不可迭代”的错误,这就是第二段代码报错的根源。

正确的提前保存迭代器写法

如果一定要先保存迭代器再遍历,不用提前await,直接用for await...of遍历即可:

let allCarsRangeIterator = ctx.stub.getStateByRange(startKey, endKey);
for await (const {key, value} of allCarsRangeIterator ) {}

内容的提问来源于stack exchange,提问作者AnMiri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:24:44