Node.JS追加数组并转换为JSON

时间:2013-06-27 10:35:59

标签: arrays json node.js for-loop

我有以下运行一些函数来获取不同的数据,我试图创建/附加到一个数组“创建”一个新的数组,然后我可以JSON.stringify并传递给Jade视图,我似乎只能获得它所做的两个循环的“k”变量,并输出“coin1coin2”和“”,而不是每个硬币名称后面有余额和地址(倍数)的JSON数组。

// list all wallets //
app.get('/wallet', function(req, res){
    var coins = app.get('coins');
    var addresses = "";
    for (var k in coins) {
        addresses += k;
        console.log('Coin: ' + k);
        //console.log(k+' => '+coins[k]);
        connect(coins[k]);
        client.getBalance('44abc0a80102', 6, function(err, balance) {
            if (err) return console.log(err);
            addresses += balance;
            //console.log('Balance: ' + balance);
        });
        client.getAddressesByAccount('44abc0a80102', function(err, address) {
            if (err) return console.log(err);
            addresses["address"] += address;
        });
    }
    console.log(addresses);
    res.render('wallet', {
        title: 'Wallet',
        address: JSON.stringify(addresses)
    });
});

在Jade视图中,我只是在做p= address以显示完整的数组,所以我至少可以在视图中创建逻辑之前看到我得到的内容。

1 个答案:

答案 0 :(得分:0)

这里的问题是,您的for循环是同步的,而您的client.getBalanceclient.getAddressesByAccount来电几乎肯定不是。

当您的for循环结束后,您的client.getBalanceclient.getAddressesByAccount操作仍在进行中,因此他们还没有机会填充您的addresses内容。因此,当它传递给模板系统时它是空的。

您可能希望使用asyncmap method之类的内容来代替。它看起来像这样:

// list all wallets
app.get('/wallet', function(req, res){
    // array? object?
    var coins = app.get('coins');

    async.map(coins, function(coinId, cb) {
        // ???
        console.log('Coin: ' + JSON.stringify(coin));

        // not sure what this does!
        connect(coin);

        client.getBalance('44abc0a80102', 6, function(err, balance) {
            if (err) return cb(err);

            client.getAddressesByAccount('44abc0a80102', function(err, address) {
                if (err) return cb(err);

                return cb(null, {
                    address: address,
                    balance: balance,
                });
            });
        });
    }, function(err, addresses) {
        // note that we only act on an error here
        if (err) {
            return console.log(err);
        }

        // [{address: ..., balance: ...}, ...]
        console.log(addresses);

        res.render('wallet', {
            title: 'Wallet',
            address: JSON.stringify(addresses),
        });
    });
});

addresses值将是{address: ..., balance: ...}个对象的数组。我不确定你的期望是什么,因为有一点你把它当成一个字符串,然后你把它当成一个对象。