代码之家  ›  专栏  ›  技术社区  ›  Gagan Suie

遍历列表并进行顺序网络调用

  •  1
  • Gagan Suie  · 技术社区  · 7 年前

    如何使用sdk遍历列表并进行顺序网络调用? 我正在尝试使用Coinbase的Node sdk,并获取所有帐户的前10个事务。

    我有一个帐户列表,我遍历它们并调用客户端。帐户,客户端。交易和客户。事务(分页)。我将结果添加到一个事务数组并返回该数组。

    我无法让它与异步/等待或请求承诺一起工作。 有什么想法吗?

    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);
        }
    

    注释掉的delay方法具有如下嵌套异步调用:

    await client.getAccount(accountId, async function(err, account) {
    if (err) {
        console.log(err);
    }
    else {
        await account.getTransactions(null, async function(err, txns, pagination) {
    .
    .
    .
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Gagan Suie    7 年前

    通过使用异步/等待和承诺解决了这个问题。等待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();
        });
    }