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
相关产品推荐
相关产品推荐

