Javascript 'then' не работает должным образом в вызовах Ripple-lib - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь создать простой пример платежей через XRPL, используя Ripple-lib .Идея состоит в том, чтобы отправить несколько платежей на разные счета, хранящиеся в массиве.Я заставил его работать по-другому, как и ожидалось, но при использовании метода then (как рекомендуют документы) это вообще не работает.

Я новичок в этой области.Javascript, так что я не очень хорошо разбираюсь в языке и асинхронном кодировании и обещаниях.При использовании парадигмы «then» код перестает работать, и в консоли не видно никаких результатов.Это код, который я сейчас использую.В комментариях внутри функции «SendXRP» я объясняю проблему.Как это можно перестроить?Между двумя способами, как правильно его кодировать?

'use strict';
const RippleAPI = require('ripple-lib').RippleAPI;

const sender = 'r*********************************';
const secret = 's****************************';
const destinations = ['r*********************************',
                      'r*********************************',
                      'r*********************************'];
const amount = 5;

// Instantiate Ripple API
const api = new RippleAPI({
  server: "wss://s.altnet.rippletest.net:51233"
});

run();


async function sendXRP(amount, fee, destination, memo) {

  // Update amount
  amount = (amount - fee).toString();

  // Build payment
  const payment = {
    source: {
      address: sender,
      maxAmount: {
        value: amount,
        currency: 'XRP'
      }
    },
    destination: {
      address: destination,
      amount: {
        value: amount,
        currency: 'XRP'
      }
    },
    memos: [
      {
          data: memo
      }
    ]
  };

  // Build instuctions
  const instructions = {
    maxLedgerVersionOffset: 5
  };

  console.log('Sending ' + amount + ' to ' + destination);

  // THIS KIND OF WORKS FOR NOW
  // Prepare the payment
  const preparedTX = await api.preparePayment(sender, payment, instructions);

  // Sign the payment
  const signedTX = api.sign(preparedTX.txJSON, secret);

  // Submit the payment
  const result = await api.submit(signedTX['signedTransaction']);

  // Return TX hash on successful TX
  if ('resultCode' in result && result['resultCode'] == 'tesSUCCESS') {
      return signedTX.id;
  } else {
      return null;
  }

  // THIS IS MORE SIMILAR TO HOW IT IS DONE IN THE DOCS! NOT WORKING!
  // ALSO, HOW DO I RETURN THE RESULT OF API.SIGN TO THE MAIN FUNCTION?
  // Prepare the payment
  // api.preparePayment(sender, payment, instructions).then(preparedTX => {
  //     // Sign the payment
  //     api.sign(preparedTX.txJSON, secret).then(signedTX => {
  //     // Submit the payment
  //     api.submit(signedTX['signedTransaction']);
  //     })
  // }).catch(console.error);
}

function run() {
// Connect to Ripple server
api.connect().then(() => {
  return api.getFee();
}).then(async fee => {

  for (var i in destinations) {
    var hash = await sendXRP(amount, Number(fee), destinations[i], 'memotext');
    console.log(hash);
  }

}).then(() => {
  return api.disconnect();
}).catch(console.error);
}

1 Ответ

0 голосов
/ 02 апреля 2019

Может быть, некоторые транзакции не удалось отправить?Если это не удалось, переменная результата из sendXRP должна иметь txresult, но, поскольку вы вернули null, если код результата не tesSUCCESS, он не возвращает информацию о результате.

const result = await api.submit(signedTX['signedTransaction']);

if ('resultCode' in result && result['resultCode'] == 'tesSUCCESS') {
  return signedTX.id;
} else {
  return null;
}

Раньше, когда я пыталсяпоследовательная отправка транзакций завершится с ошибкой и вернет код ошибки tefPAST_SEQ.

"Порядковый номер транзакции ниже текущего порядкового номера учетной записи, отправляющей транзакцию."из https://developers.ripple.com/tef-codes.html

Я рекомендую удалить блок if ('resultCode' в результате ...) и проверить результат транзакции.Если транзакции не были выполнены с ошибкой tefPAST_SEQ, мое решение для этого - вручную установить последовательность учетной записи или добавить setTimeOut после каждой отправки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...