资产没有在for循环中更新

时间:2018-07-07 22:22:05

标签: javascript blockchain hyperledger hyperledger-composer

我正在尝试在事务中使用for循环。 for循环基本上会创建新资产,即。我每次迭代都会创建一个新资产。

问题在于,每次循环迭代vals.length的值都保持为零(0)。如果我尝试做console.log(vals),那么即使循环迭代i=1,2,3...

,它也会显示空数组

但是一旦完成整个交易功能,我就能在UI中看到资产。

model.cto

asset Net identified by NetNumber{
    o String NetNumber
    o Integer totaltransaction
}

transaction GenerateNet {

}

logic.js

/**
* 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。

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()即可解决。