Оригинальный текст здесь[1].
ты можешь продлитьWeb3Subscription
Класс для создания пользовательских подписок。так,Затем вы можете подписаться на пользовательское событие, выпущенное провайдером.
ПРИМЕЧАНИЕ. Это руководство, скорее всего, предназначено для опытных пользователей, подключающихся к узлам, предлагающим дополнительные пользовательские подписки. Обычным пользователям доступны стандартные подписки [2] в разделе «Поддерживаемые подписки».
Это важно, если вы разработчик, предоставляющий своим пользователям индивидуальные подписки. Мы рекомендуем вам разработать плагин web3.js после прочтения приведенного ниже руководства. Однако вы можете узнать, как разрабатывать плагины, в Руководстве разработчика плагинов web3.js [3]. Даже если вы не являетесь разработчиком, предоставляющим такую пользовательскую подписку, вам рекомендуется написать плагин web3.js для специальной подписки и опубликовать его в реестре пакетов npm. Таким образом, вы можете помочь сообществу. Они могут внести свой вклад в ваш репозиторий и помочь вам в таких вещах, как добавление функций, поддержка и обнаружение ошибок.
Чтобы создать пользовательскую подписку,Сначала нужно расширитьWeb3Subscription
добрый。Однако,Web3Subscription
это общий тип。в целом,Вам нужно указать только первые два типа,Они есть:
•EventMap
:Подписка оформленасобытиеизсобытиекартографирование•ArgsType
:перешел кподпискаизпараметр
Например:
class MyCustomSubscription extends Web3Subscription<
{
// here provide the type of the `data` that will be emitted by the node
data: string;
},
// here specify the types of the arguments that will be passed to the node when subscribing
{
customArg: string;
}
> {
// ...
}
你需要指定将перешел к提供者източныйданные。ты можешь пройтинад вамииздобрыйсерединапереписать_buildSubscriptionParams
чтобы добиться этого。Это может выглядеть так:
protected _buildSubscriptionParams() {
// `someCustomSubscription` ниже — это имя подписки, предоставленное узлом, к которому вы подключены.
return ['someCustomSubscription', this.args];
}
Следуя приведенной выше реализации, вызов провайдера будет выглядеть следующим образом:
{
id: '[GUID-STRING]', // something like: '3f839900-afdd-4553-bca7-b4e2b835c687'
jsonrpc: '2.0',
method: 'eth_subscribe',
// The `someCustomSubscription` below is the name of the subscription provided by the node you are connected to.
// And the `args` is the variable that has the type you provided at the second generic type
// at your class definition. That is in the snippet above: `{customArg: string}`.
// And its value is what you provided when you will call:
// `web3.subscriptionManager.subscribe('custom', args)`
params: ['someCustomSubscription', args],
}
Возможно, вам придется выполнить некоторую обработку в конструкторе. Или вам может потребоваться выполнить некоторое форматирование данных, прежде чем они будут отправлены источником событий. В этом разделе вы можете увидеть, как выполнить одну или обе эти операции.
При желании вы можете написать конструктор на случай, если вам понадобится дополнительная инициализация или обработка. Вот пример реализации конструктора:
constructor(
args: {customArg: string},
options: {
subscriptionManager: Web3SubscriptionManager;
returnFormat?: DataFormat;
}
) {
super(args, options);
// Additional initialization
}
Конструктор передает параметрыWeb3Subscription
отецдобрый。
ты можешь пройтиthis.subscriptionManager
Посетите менеджер подписок。
Если вам необходимо отформатировать данные до того, как они будут получены от узла и отправлены,你只需要над вамииздобрыйсерединапереписатьзащищенныйизметодformatSubscriptionResult
。Это будет выглядеть как нижетак。Однако,Тип данных может быть любым типом, предоставленным узлом.,Это ты расширяешьсяWeb3Subscription
был предоставленизпервый дженерикдобрыйформа:
protected formatSubscriptionResult(data: string) {
const formattedData = format(data);
return formattedData;
}
Подписаться,Вам необходимо передать свою пользовательскую подпискуWeb3
。Затем,ты можешь сделать это для себяиз Настроитьподпискавызовsubscribe
метод,Как показано в следующем примере:
const CustomSubscriptions = {
// the key (`custom`) is what you chose to use when you call `web3.subscriptionManager.subscribe`.
// the value (`CustomSubscription`) is your class name.
custom: MyCustomSubscription,
// you can have as many custom subscriptions as you like...
// custom2: MyCustomSubscription2,
// custom3: MyCustomSubscription3,
};
const web3 = new Web3({
provider, // the provider that support the custom event that you like to subscribe to.
registeredSubscriptions: CustomSubscriptions,
});
// subscribe at the provider:
// Note: this will internally initialize a new instance of `MyCustomSubscription`,
// call `_buildSubscriptionParams`, and then send the `eth_subscribe` RPC call.
const sub = web3.subscriptionManager.subscribe('custom', args);
// listen to the emitted event:
// Note: the data will be optionally formatted at `formatSubscriptionResult`, before it is emitted here.
sub.on('data', (result) => {
// This will be called every time a new data arrived from the provider to this subscription
});
Отписаться:
// this will send `eth_unsubscribe` to stop the subscription.
await sub.unsubscribe();
Вот полный пример реализации пользовательской подписки:
// Subscription class
class MyCustomSubscription extends Web3Subscription<
{
// here provide the type of the `data` that will be emitted by the node
data: string;
},
// here specify the types of the arguments that will be passed to the node when subscribing
{
customArg: string;
}
> {
protected _buildSubscriptionParams() {
// the `someCustomSubscription` below is the name of the subscription provided by the node your are connected to.
return ['someCustomSubscription', this.args];
}
protected formatSubscriptionResult(data: string) {
return format(data);
}
constructor(
args: { customArg: string },
options: {
subscriptionManager: Web3SubscriptionManager;
returnFormat?: DataFormat;
}
) {
super(args, options);
// Additional initialization
}
}
// Usage
const args = {
customArg: 'hello custom',
};
const CustomSubscriptions = {
// the key (`custom`) is what you chose to use when you call `web3.subscriptionManager.subscribe`.
// the value (`MyCustomSubscription`) is your class name.
custom: MyCustomSubscription,
// you can have as many custom subscriptions as you like...
// custom2: MyCustomSubscription2,
// custom3: MyCustomSubscription3,
};
const web3 = new Web3({
provider, // the provider that support the custom event that you like to subscribe to.
registeredSubscriptions: CustomSubscriptions,
});
const sub = web3.subscriptionManager.subscribe('custom', args);
sub.on('data', (result) => {
// New data
});
/* Unsubscribe:
If you want to subscribe later based on some code logic:
if () { await sub.subscribe(); }
*/
•РасширятьWeb3Subscription
добрый以创建Настроитьподписка。•在泛формадобрыйформасередина指定событиеданныеиподпискапараметрдобрыйформа。•переписать_buildSubscriptionParams()
определитьRPCпараметр。•опционально добавитьпользовательский конструктор Выполнить логику инициализации。•При желании используйтеformat SubscriptionResult()
выдаетданные Отформатируйте результат перед。
•вWeb3
Передайте подписку в параметрах конструктора, чтобы зарегистрировать подписку.。•использоватьsubscriptionManager
подписка/Отменаподписка。•мониторподпискасобытие,нравитьсяdata
,чтобы получить новые результаты.
в общем,web3.jsподпискаобеспечивает гибкуюизспособподписка Настроить提供者событие。проходить РасширятьWeb3Subscription
,Реализация ключевых методов,и сWeb3
зарегистрироваться,Вы можете создавать индивидуальные подписки для любого специального события, которое может выдать поставщик. API подписки обрабатывает базовые вызовы JSON-RPC.,и позволяет настраивать обработку и форматирование результатов.
Отказ от ответственности: эта работа распространяется под лицензией Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)[4]. Автор: мэнбин[5] блог: мэнбин[6] Гитхаб: mengbin92[7] cnblogs: Непреднамеренно полюбила воду[8] Сообщество разработчиков облачных технологий Tencent: Мюнстер[9]
[1]
здесь: https://docs.web3js.org/guides/events_subscriptions/custom_subscriptions
[2]
Стандартная подписка: https://docs.web3js.org/guides/events_subscriptions/
[3]
Руководство разработчика плагина web3.js: https://docs.web3js.org/guides/web3_plugin_guide/plugin_authors
[4]
С указанием авторства-Некоммерческая-ShareAlike 4.0 интернациональность (CC BY-NC-SA 4.0): https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh
[5]
mengbin: mengbin1992@outlook.com
[6]
mengbin: https://mengbin.top
[7]
mengbin92: https://mengbin92.github.io/
[8]
Влюбляюсь в воду нечаянно: https://www.cnblogs.com/lianshuiwuyi/
[9]
Мюнстер: https://cloud.tencent.com/developer/user/6649301