Рекурсия с обещаниями асинхронных звонков - PullRequest
0 голосов
/ 15 декабря 2018

Я использую внешний API, который я использую в качестве источника данных.Этот API возвращает свои данные на основе типа, подобного нумерации страниц.

Так что я могу получить данные для страниц 1, 2, 3 и т. Д. Но проблема в том, что мне нужны все данные одновременно, APIне поддерживает это, поэтому я пишу это сам.

Я сделал фактический код вызова:

function getTransactionPart(start){
        return new Promise(function(resolve, reject) {

            const options = {
                url: 'myurl?limit=40&start='+start,
                json: true
            };

            let result = {total_transactions : 0, transactions : []};

            request(options, function (error, response, body) {

                if (error) {
                    return reject(result);
                }

                body.data.forEach(function (transaction) {
                        result.transactions.push({
                            timestamp: transaction.timestamp,
                            amount: transaction.amount,
                            confirmed: transaction.confirmed
                        });
                });

                result.total_transactions = body.total

                return resolve(result);
            })
        })
    }

Приведенный выше код возвращает мне ожидаемые результаты с пределом, который я дал.Также я получаю номер обратно (result.total_transactions), когда это больше 40, мне нужно сделать еще один вызов с 40 в качестве запуска и т. Д. И т. Д.

Код, в котором мне нужно его объединить:

 function getTransactions(start) {
        return new Promise(function(resolve, reject) {

            getTransactionPart(start).then(result => {
                if(result.total_transactions > 40) {
                    //next call
                } else {
                    // return all?
                }
                console.log(result)
            }).catch(error => {
                console.error(error);
                return r.json({

                })
            });

        })
    }

Итак, я делаю первый вызов с getTransactionPart (0), после чего сам метод должен объединить результат из всех вложенных вызовов и вернуть весь результат, как и ожидалось.Как я могу сделать это с помощью рекурсии и обещаний?

1 Ответ

0 голосов
/ 15 декабря 2018

Это проще, если вы используете функцию async и await запрос:

  async function getTransactions(start) {
    const result = [];
    for(let pos = start; ; pos += 40) {
      const { total_transactions, transactions } = await getTransactionPart(pos);
      result.push(...transactions);

      if(total_transactions < 40) break;
    }
    return result;
 }

Конечно, вы также можете сделать это рекурсивно, но вам это действительно нужно?

async function getTransactions(start) {
  const { total_transactions, transactions } = await getTransactionPart(pos);
  if(total_transactions < 40) 
     return transactions;

  return transactions.concat(await getTransactions(start + 40));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...