Консоль, регистрирующая двойной массив из функции solidity?

#javascript #chai #solidity

#javascript #чай #солидность

Вопрос:

Я выполняю тесты chai и хочу получить двойной массив из функции смарт-контракта и записать его в консоль. Моя функция:

 function getBuyOrderBook(string symbolName) constant returns (uint[], uint[]) {
    uint8 tokenNameIndex = getSymbolIndexOrThrow(symbolName);
    uint[] memory arrPricesBuy = new uint[](tokens[tokenNameIndex].amountBuyPrices);//length of the prices
    uint[] memory arrVolumesBuy = new uint[](tokens[tokenNameIndex].amountBuyPrices);

       

        uint whilePrice = tokens[tokenNameIndex].lowestBuyPrice;
        uint counter = 0;
        if(tokens[tokenNameIndex].curBuyPrice > 0){ 
            while(whilePrice <= tokens[tokenNameIndex].curBuyPrice ){

                arrPricesBuy[counter] = whilePrice;
                
                uint volumeAtPrice = 0;

                uint offers_key = 0;
                offers_key = tokens[tokenNameIndex].buyBook[whilePrice].offers_key;

                while(tokens[tokenNameIndex].buyBook[whilePrice].offers_length >= offers_key){

                    volumeAtPrice  = tokens[tokenNameIndex].buyBook[whilePrice].offers[offers_key].amount;//increase the amount(i.e. 10 tokens) to this price (i.e. 10$)
                    offers_key   ; //
                   
                }
                arrVolumesBuy[counter] = volumeAtPrice;
                if(whilePrice == tokens[tokenNameIndex].buyBook[whilePrice].higherPrice){ 

                    break;
                }
                else{
                    whilePrice == tokens[tokenNameIndex].buyBook[whilePrice].higherPrice ; 

                }
            counter   ; 

        }
           

            

    }

        return (arrPricesBuy, arrVolumesBuy ) ;


}
  

Но не знаю, как записать в консоль обещание, чтобы я мог вернуть два массива :

  let arr1 = [];
 let arr2 = [];

 arr1,arr2 =  await exchangeInstance.getArr(tokenSymbol);
 console.log(arr1, arr2);
  

Это явно не работает, есть предложения?

Спасибо

Комментарии:

1. Вы пробовали a = await exchangeInstance.getArr(tokenSymbol); console.log(a) ? или let [arr1, arr2] = await exchangeInstance.getArr(tokenSymbol); ? (во втором случае вам не нужны строки let arr1 и let arr2 )

2. Попробуйте изменить возвращаемое значение: return [myArr1,myArr2] в функции getArr.

3. Вам трудно сказать, потому что в вашем вопросе так мало кода.. Я должен угадать, что вам нужно… Хорошо, каков результат getArr функции? Является ли это массивом массивов?

4. Хм, хорошо, я попробовал: let items = [[],[]]; items = await exchangeInstance.getBuyOrderBook(tokenSymbol); console.table(items); И это работает, но только если у меня один заказ и результат должен быть 1100. Каждый массив содержит два значения… Если я сделаю другой заказ, и результат должен быть [1100] [2200], это выдаст мне ошибку недопустимого кода обновления? также пытался изменить возвращаемое значение в моей функции, как вы предлагали, чтобы вернуть [myArr1, myArr2], но получил :TypeError: невозможно определить общий тип для элементов массива?

5. Итак, чтобы немного подробнее объяснить мою функцию getArr и что она должна возвращать… myArr1 повторно выполняет накопительную сумму одного значения, а myArr2 — другое накопительное значение. Таким образом, я должен иметь возможность возвращать myArr1, myArr2 : [20][1]; [50][2];[10][4]… Это 3 заказа, я создаю exchange, так что это 3 значения книги заказов… Один массив для объема, а другой для цены, я также могу вставить весь код функции, если хотите? Спасибо

Ответ №1:

Извини, чувак, я не могу распознать, что это за подмножество языка JavaScript, но в чистом JS это будет что-то вроде этого:

 function getBuyOrderBook(symbolName) {
  const arr1 = []; // our generated array 1
  const arr2 = []; // our generated array 2
  arr1.push.apply(arr1, [1, 2, 3]); // some operations with array 1
  arr2.push.apply(arr2, [4, 5, 6]); // some operations with array 2
  return [arr1, arr2]; // return combined result
}

let [a1, a2] = /*await*/ getBuyOrderBook(); // unpack result into 2 variables

console.log('a1 =', a1); // show var 1
console.log('a2 =', a2); // show var 2  

Имеет ли это смысл для вас?

Комментарии:

1. Функция, которую я вызываю, находится в solidity, а тесты chai — в javascript…so этот код не компилируется… спасибо за ввод, действительно оцените его … это то, что у меня есть до сих пор, и я могу вернуть один заказ… ожидать(ожидать exchangeInstance.buyToken(tokenSymbol, 200, 2)); // ожидать(ожидать exchangeInstance.buyToken(tokenSymbol, 100, 1)); но если я добавлю этот порядок, я получу ошибку: неверный код операции?? пусть элементы = [[],[]]; элементы = ожидают обмена.getBuyOrderBook(tokenSymbol); console.table(элементы);