#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(элементы);