迭代列表并进行顺序网络调用

时间:2018-05-05 07:51:35

标签: javascript node.js aws-lambda

如何使用sdk遍历列表并进行顺序网络调用? 我正在尝试使用Coinbase的Node sdk并获得所有帐户的前10笔交易。

我有一个帐户列表,我遍历它们并调用client.account,client.transactions和client.transactions(pagination)。我将结果添加到一个事务数组并返回该数组。

我无法使用async / await或request-promises。 有什么想法吗?

https://developers.coinbase.com/api/v2#transactions

var rp = require('request-promise');
var coinbase = require('coinbase');
var client = new coinbase.Client({ 'apiKey': 'keyStuff', 'apiSecret': 'secretStuff' });
var accountList = ['acct1','acct2','acct3',];
var transactionList = [];


try {
        let ps = [];
        accountList.forEach(acctId => {
            var account = client.getAccount(accountId, null);
            ps.push(rp(account));
        });
        Promise.all(ps)
            .then(responses => {
                for (var i = 0; i < responses.length; i++) {
                    var result = responses[i];
                    rp(result.account.getTransactions(null))
                        .then(res => {
                            res.pagination = 10;
                            return rp(result.account.getTransactions(null, res.pagination));
                        }).catch(err => console.log(err))
                        .then(txns => {
                            try {
                                if (txns.length > 0) {
                                    txns.forEach(function(txn) {
                                            var transaction = {
                                                "trade_type": "",
                                                "price": ""
                                            };
                                            transaction.trade_type = txn.type;
                                            transaction.price = txn.native_amount.amount;
                                            transactionList.push(transaction);
                                    });
                                }
                            }
                            catch (err) {
                                console.log(err);
                            }
                        });
                }

            }).catch(err => console.log(err));
        return transactionList;

        //-------------------------------------------------------------------

        // if (accountList.length > 0) {

        //     for (let acctId of accountList) {
        //         console.log("account id: " + acctId);
        //         await delayTransactions(acctId);
        //     }

        //     console.log("got here last");
        //     return transactionList;
        // }
    }
    catch (error) {
        console.log(error);
    }

注释掉的延迟方法具有嵌套的异步调用,如下所示:

await client.getAccount(accountId, async function(err, account) {
if (err) {
    console.log(err);
}
else {
    await account.getTransactions(null, async function(err, txns, pagination) {
.
.
.

1 个答案:

答案 0 :(得分:0)

使用async / await和promises解决了这个问题。等待coinbase方法不起作用,因为它们不是异步函数(惊喜!)。

function delayedMethod() {
    new Promise(resolve => {
    client.getAccount(accountId, async function(err, account) {
    if (err) {
        console.log(err);
    }
    else {
        account.getTransactions(null, async function(err, txns, pagination) {
    .
    .
    .
    resolve();
    });
}