Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何订阅Event Trigger 中的事件? #53

Open
Rhain opened this issue Jun 23, 2018 · 8 comments
Open

如何订阅Event Trigger 中的事件? #53

Rhain opened this issue Jun 23, 2018 · 8 comments

Comments

@Rhain
Copy link

Rhain commented Jun 23, 2018

比如说一个NRC20的 transfer事件, 当一个账户调用了transfer方法后,虽然有调用transferEvent, 但是没有文档写明如何才能订阅到这个事件。

以太坊的是可以监听到这样的事件的。星云文档里面好像没有说明。

用处之一,比如说有其他人给我的地址transfer了token,我需要可以被通知到这个事件进行处理, 不知道星云对这种需求时如何处理的。 在网上未找到相应的文档。 只看到了getEventsByHash这个相关的方法,但是这个需要有hash才行,问题是别人给我transfer了token,我肯定是不知道他的交易hash的,所以这个方法也是没有用。

还请帮忙解答下。

使用了subscribe 方法,但是按照文档中代码来使用的时候报错。
代码如下:

var Nebulas = require('./index')

var Neb = Nebulas.Neb;
var neb = new Neb();
neb.api.subscribe({"topics": ["chain.contract.TestContract"]}).then(function(eventData) {
    console.log(JSON.stringify(eventData));
}).catch(function (e) { console.log("error:" + e) });

但是过一段时间会报下面的错误:

Unexpected token < in JSON at position 0
@Rhain
Copy link
Author

Rhain commented Jun 23, 2018

测试了一下,确实是subscribe来订阅, 后面调用transfer方法的时候收到了通知。 但是还有一个疑问,当有一段时间没有收到通知的时候就报

Unexpected token < in JSON at position 0

这个错误。

我的理解是这个应该会保持一个长连接,每过一段时间就会返回一个数据包。但是没有数据的时候返回了空,导致解析异常?异常之后这个长连接感觉就结束了, 问题来了,应该如果保持这个长连接呢?

@yupnano
Copy link
Contributor

yupnano commented Jun 23, 2018

你好,neb.js的 subscribe 需要指定一个函数来接收返回event事件,比如:

neb.api.subscribe(["chain.contract.TestContract"],onDownloadProgress )

var onDownloadProgress = function(event){
    console.log(event);
}

@Rhain
Copy link
Author

Rhain commented Jun 24, 2018

@yupnano 使用你说的方式指定了一个onDownloadProgeress 方法.

neb.api.subscribe({"topics": ["chain.contract.TestToken"]}, onDownloadProgress ).then(function(eventData) {
    logger.info('event data:' + JSON.stringify(eventData));
}).catch(function (e) {
    logger.error("error:" + e)
});

function onDownloadProgress(event) {
    logger.warn('subscribe event:' + event);
}

会有这么一个情况,如果启动这个订阅后一段时间时间没有订阅数据返回的话,就会报下面的错:

image

一旦报错了,后面感觉订阅就失败了,后面即使有调用transfer方法也不会收到订阅信息了。

如果启动订阅后,马上调用了transfer方法,是可以收到订阅信息。但是有时候又收不到,感觉很不稳定,同时收到这个信息的时间会比交易成功迟比较久的时间,给人的感觉就是通知不及时。不知道这是不是在测试环境的原因?

对于这种订阅,有没有一种稳定的方法可以获取到订阅信息的?

@Rhain
Copy link
Author

Rhain commented Jun 27, 2018

@yupnano 可不可以解答下, 后面会基于星云做项目,这个订阅事件的功能还是很关键的,如果这个功能有问题,那可能会转向尝试其他公链,还请帮忙解答下呀。

@yupnano
Copy link
Contributor

yupnano commented Jun 27, 2018

直接连接测试网或主网请求subscribe的话,可能会由于网络问题丢失event,甚至连接失败。
建议运行本地节点,然后与主网同步,然后向本地节点请求subscribe,这样应该会稳定一些。

@Rhain
Copy link
Author

Rhain commented Jul 2, 2018

是不是意味着即使是运行了本地节点,也有可能会丢失event? 所以又提供了一个通过txhash来获取event的接口,这样即使subscribe没有获取到event,也可以通过txhash来查询event数据?

@1c7
Copy link
Contributor

1c7 commented Mar 2, 2019

event subscribe 请问有进展吗?

@1c7
Copy link
Contributor

1c7 commented Mar 2, 2019

相关讨论:
nebulasio/go-nebulas#61
(无结论,仅供参考)

相关文档:
https://github.com/nebulasio/wiki/blob/master/rpc.md#subscribe

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants