Перебор списка и последовательные сетевые вызовы - PullRequest
0 голосов
/ 05 мая 2018

Как мне перебрать список и сделать последовательные сетевые вызовы, используя SDK? Я пытаюсь использовать Node sink Coinbase и получить первые 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 голосов
/ 13 мая 2018

Решено с помощью async / await и обещаний. ожидание методов 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();
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...