首页 > 解决方案 > 回调函数只被调用一次

问题描述

我正在编写一个 ZooKeeper 客户端来监视一个节点。回调函数仅在我第一次更改节点数据时被调用。我不确定为什么该函数不会在第二次更改时执行。

第二个查询是,如果我取消对最后一个close()函数的注释,我的程序将终止。作为一个好的做法,我应该使用该close()函数,但它不会进入阻塞状态来监听传入的事件。我如何实现它?我已经阅读了文档,但找不到任何有用的东西。

var zookeeper = require("node-zookeeper-client");

var client = zookeeper.createClient("192.168.43.172:2181");
var path = process.argv[2];

client.once("connected", function() {
  console.log("Connected to the server.");
  client.create(path, new Buffer("data"), function(error) {
    if (error) {
      console.log("Failed to create node: %s due to: %s.", path, error);
    } else {
      console.log("Node: %s is successfully created.", path);
    }
  });

  client.getData(
    path,
    function(event) {
      console.log("Got event: %s.", event);
    },
    function(error, data, stat) {
      if (error) {
        console.log(error.stack);
        return;
      }
      console.log("Got data: %s", data.toString("utf8"));
    }
    );
  //client.close();
});

client.connect();

标签: node.jsapache-zookeeper

解决方案


我的第二个查询仍然没有答案,但对于第一个查询,zookeeper 服务器旨在仅在第一次发生更改时发送事件,然后删除开关。为了继续接收事件,我不得不在处理触发事件时再次设置手表。下面是我的代码:

var zookeeper = require("node-zookeeper-client");

var client = zookeeper.createClient("192.168.43.172:2181");
var path = process.argv[2];

client.once("connected", function() {
  console.log("Connected to the server.");

  var watch = function(event) {
    console.log("Got event: %s.", event);
    client.getData(path, watch, getDat);
  };

  var getDat = function(error, data, stat) {
    if (error) {
      console.log(error.stack);
      return;
    }
    console.log("Got data: %s", data.toString("utf8"));
  };

  client.getData(path, watch, getDat);
  // client.close();
});

client.connect();

推荐阅读