我正在尝试在事务中使用for循环。 for循环基本上会创建新资产,即。我每次迭代都会创建一个新资产。
问题在于,每次循环迭代vals.length
的值都保持为零(0)。如果我尝试做console.log(vals)
,那么即使循环迭代i=1,2,3...
但是一旦完成整个交易功能,我就能在UI中看到资产。
asset Net identified by NetNumber{
o String NetNumber
o Integer totaltransaction
}
transaction GenerateNet {
}
/**
* submit an order
* @param {org.demo.invoice.GenerateNet}
* @transaction
*/
async function GenerateNet(){
var amt = [200, 500, 700];
var netNumber = ['aa', 'bb', 'cc'];
for(var i=0; i < amt.length; i++){
let netRegistry = await getAssetRegistry('org.demo.invoice.Net');
let vals = await netRegistry.getAll();
console.log(vals.length);
console.log(vals);
let newNetting = factory.newResource('org.demo.invoice','Net', netNumber);
newNetting.totaltransaction = amt[i];
await nettingRegistry.add(newNetting);
}
}
我希望随着迭代的进行,vals.length的值为1,2,3。
答案 0 :(得分:1)
您正在尝试读取自己的写入内容,即您正在将资产存储在注册表中,然后尝试读取该注册表以取回您已写入的资产。在超账结构中这是不可能的。它不允许您读取自己的文字,只能读取最后的提交状态,有关更多信息,请参见http://hyperledger-fabric.readthedocs.io/en/release-1.1/readwrite.html。
答案 1 :(得分:1)
在批准交易之前,新资产不会添加到分类账中。因此,在运行代码时,实际上没有添加任何资产,如果批准了交易,则计划将其添加。
换句话说,您不能在同一笔交易中添加资产并对其进行读取。
答案 2 :(得分:0)
您的for循环在继续下一次迭代之前不会等待异步任务完成。您可以做的是改用递归:
var amt = [200, 500, 700];
var netNumber = ['aa', 'bb', 'cc'];
async function GenerateNet(i = 0){
let netRegistry = await getAssetRegistry('org.demo.invoice.Net');
let vals = await netRegistry.getAll();
console.log(vals.length);
console.log(vals);
let newNetting = factory.newResource('org.demo.invoice','Net', netNumber);
newNetting.totaltransaction = amt[i];
await nettingRegistry.add(newNetting);
const nextIndex = i++;
if (nextIndex < amt.length) {
return GenerateNet(nextIndex);
}
}
await GenerateNet();
// All iterations have finished
由于每次递归都返回GenerateNet
的结果,所以在所有 迭代完成后调用await GenerateNet()
即可解决。