Создаем на Flow | Изучаем FCL — 3. Как вернуть пользовательское значение из скрипта
Published: 2022-06-30 16:41:15

## Краткий обзор

В этом руководстве вы узнаете, как вернуть значение, содержащее несколько других значений, которые не имеют одинакового типа. Для этого мы разберем и используем пользовательскую структуру Cadence Struct.

- определить пользовательскую структуру в строке скрипта
- создать экземпляр вышеупомянутой структуры и использовать его в качестве возвращаемого значения скрипта

> 💡Лучше учиться с помощью видео? К счастью для вас, есть видео, которое вы можете смотреть вместе с этим руководством. Рассказывает один и единственный разработчик Flow Developer Advocate - [Kimcodeashian](https://twitter.com/kimcodeashian)!

## Контент Kimazing
[https://youtu.be/DWz8Plv5n3k](https://youtu.be/DWz8Plv5n3k)

## Ранее в разделе "Изучение FCL"
В [предыдущем посте](https://dev.to/egormajj/sozdaiem-na-flow-izuchitie-fcl-2-pieriedavaitie-arghumienty-v-skripty-2ld2) мы узнали, как передавать аргументы в наш скрипт Cadence. Но если вы помните один из примеров - `passMultipleDifferentTypes` - мы могли вернуть только одно значение, хотя передавали несколько различных типов.

Сегодня я покажу вам, как можно определить пользовательскую структуру в строке скрипта, а затем использовать ее в качестве возвращаемого типа.

Приступим! 💪

## Шаг 1 - Установка
Добавьте `"@onflow/fcl": "1.0.0"` в качестве зависимости

## Шаг 2 - Настройка
Как и в прошлый раз импортируем необходимые методы и настраиваем FCL:

```javascript
import { query, config } from "@onflow/fcl";

const api = "https://rest-testnet.onflow.org";
config().put("accessNode.api", api);

```

## Шаг 3 - Реализация метода `fetchCustom`
В строке скрипта разрешается определять новые структуры. Мы создадим одну из них и назовем ее `Custom` (можно использовать любое имя по своему усмотрению)

```javascript
const fetchCustom = async (name) => {
  const cadence = `
    // We will define custom Struct with name Custom :)
    pub struct Custom {

      pub let number: Int
      pub let address: Address

      // underscore before name of the arguments will allow us to pass values
      // without specifying the name of the arguments, which is usefull when
      // you have only a few of them

      init(number: Int, address: Address){
        self.number = number
        self.address = address
      }
    }

    pub fun main():Custom {
        // in order to create instance of a struct you use it's name
        // and pass initialization arguments in parentheses
        let t = Custom(number: 42, address: 0x1337)
        return t
    }
  `;

  const custom = await query({ cadence });

  const { number, address } = custom;
  console.log(`number field is ${number}`)
  console.log(`address field is ${address}`)
};
```

## Заключение
Как всегда, выполним код с помощью IIFE:

```javascript
(async () => {
  console.clear();
  await fetchCustom();
})();

```
В консоли вы должны увидеть следующий результат:

```javascript
number field is: 42
address field is: 0x0000000000001337
```
Вы потерялись 🤷♂️? Не беспокойтесь 😉 - проверьте [полный код на Codesandbox](https://codesandbox.io/s/dev-to-fcl-return-custom-struct-sgywnx?file=/src/index.js:1399-1512).

В следующий раз мы применим наши приобретенные навыки и используем [.find](https://find.xyz/) deployed contract для преобразования .find identity name в адрес.

До следующего раза 👋

## Информационные ресурсы

- **Пример кода** — [https://codesandbox.io/s/dev-to-fcl-return-custom-struct-sgywnx](https://codesandbox.io/s/dev-to-fcl-return-custom-struct-sgywnx)
- **Cadence Structs** —[https://docs.onflow.org/cadence/language/composite-types/#composite-type-declaration-and-creation](https://docs.onflow.org/cadence/language/composite-types/#composite-type-declaration-and-creation)


Другие источники, которые могут быть вам полезны:

- **(ENG) | Документация Flow** - https://docs.onflow.org/ - более детальная информации о блокчейне Flow и как взаимодействовать с ним
- **(ENG) | Flow Portal** - https://flow.com/ - your entry point to Flow
- **(ENG) | FCL JS** - https://github.com/onflow/fcl-js - Исходный код и возможность поучаствовать в разработке библиотеки FCL JS library
- **(ENG) | Cadence** - https://docs.onflow.org/cadence/ - Введение в язык программирования Cadence
- **Codesandbox** - https://codesandbox.io - Замечательная среда разработки и прототипирования прямо в вашем браузере