【问题标题】:Frustrating syntax error令人沮丧的语法错误
【发布时间】:2015-01-14 04:58:01
【问题描述】:

该项目使用 Apple 的 homekit 和树莓派 (https://github.com/KhaosT/HAP-NodeJS) 上的 node.js 服务器打开/关闭设备等。因此 Light_accessory.js,当 vaule 为 true(1) 时,使用子进程和接线 pi 打开灯(继电器)。当值为false(0)时,它还需要关闭灯(gpio write 7 1)。我曾尝试向其中添加 IF 语句(接近尾声),但我不断从 if 语句中收到语法错误。不知道为什么。 //沮丧。

// HomeKit types required
var types = require("./types.js")
var exports = module.exports = {};
var exec = require('child_process').exec;

var execute = function(accessory, characteristic, value) {
    console.log("executed accessory: " + accessory + ", and characteristic: " + characteristic + ", with value: " + value + ".");
}

exports.accessory = {
    displayName: "Light",
    username: "1A:2B:4A:4D:5E:FF",
    pincode: "031-45-154",
    services: [{
        sType: types.ACCESSORY_INFORMATION_STYPE,
        characteristics: [{
            cType: types.NAME_CTYPE,
            onUpdate: null,
            perms: ["pr"],
            format: "string",
            initialValue: "Light 0",
            supportEvents: false,
            supportBonjour: false,
            manfDescription: "Bla",
            designedMaxLength: 255
        }, {
            cType: types.MANUFACTURER_CTYPE,
            onUpdate: null,
            perms: ["pr"],
            format: "string",
            initialValue: "Oltica",
            supportEvents: false,
            supportBonjour: false,
            manfDescription: "Bla",
            designedMaxLength: 255
        }, {
            cType: types.MODEL_CTYPE,
            onUpdate: null,
            perms: ["pr"],
            format: "string",
            initialValue: "Rev-1",
            supportEvents: false,
            supportBonjour: false,
            manfDescription: "Bla",
            designedMaxLength: 255
        }, {
            cType: types.SERIAL_NUMBER_CTYPE,
            onUpdate: null,
            perms: ["pr"],
            format: "string",
            initialValue: "A1S2NASF88EW",
            supportEvents: false,
            supportBonjour: false,
            manfDescription: "Bla",
            designedMaxLength: 255
        }, {
            cType: types.IDENTIFY_CTYPE,
            onUpdate: null,
            perms: ["pw"],
            format: "bool",
            initialValue: false,
            supportEvents: false,
            supportBonjour: false,
            manfDescription: "Identify Accessory",
            designedMaxLength: 1
        }]
    }, {
        sType: types.LIGHTBULB_STYPE,
        characteristics: [{
            cType: types.NAME_CTYPE,
            onUpdate: null,
            perms: ["pr"],
            format: "string",
            initialValue: "Light 1",
            supportEvents: false,
            supportBonjour: false,
            manfDescription: "Bla",
            designedMaxLength: 255
        }, {
            cType: types.POWER_STATE_CTYPE,
            onUpdate:

                if ((function(value)) == 1) {
                    exec('gpio write 7 0' + value,function(error, stdout, stderr) {}
                },
                if ((function(value)) == 0) {
                    exec('gpio write 7 1' + value,function(error, stdout, stderr) {}
                },
                );

            },
            perms: ["pw", "pr", "ev"],
            format: "bool",
            initialValue: false,
            supportEvents: false,
            supportBonjour: false,
            manfDescription: "Turn On the Light",
            designedMaxLength: 1
            },
        }]
    }]
}

【问题讨论】:

  • 你能举个例子吗?
  • 我不会称自己为 n00b,但我是 n00b。我可以通过查看其他程序并将各个部分组合在一起来摸索大多数语言,但我永远无法坐下来写作像这样的程序。如果您能抽出时间,我们将不胜感激。
  • 好吧,你必须为onUpdate 分配一个函数(我假设)。 onUpdate: function() { if (...) .... },(function(value)) 也是无效的,我不知道那应该是什么。也许你的意思是传递给onUpdate的值,在这种情况下:onUpdate: function(value) { if (value == 1) .... },

标签: javascript node.js if-statement syntax homekit


【解决方案1】:

我注意到的第一件事是你把一个对象和一个代码块混在一起了。您可以阅读 JSON,这将使您熟悉 javascript 对象(不一样,here 是一个简短的解释),但希望这会有所帮助。

您不能将代码块直接放入对象中。一个对象有一个key,然后是一个value。在此处注意您的代码

onUpdate:
  if ((function(value)) == 1) { // ...

onUpdate 将是您的关键,然后您直接开始进入代码块。

因此,将代码块放入对象的方法是使用函数。如果你做类似的事情..

onUpdate: function () {
  if (value == 1) {
    // do something
  } else {
    // do something else
  }

这将使您的 onUpdate 现在成为您可以调用的函数。

我还没有通读您代码中的所有内容,但这肯定是一个语法问题,不会让您编译。

同时查看您的 if ((function(value)) == 1) 逻辑对我来说似乎是一种代码味道(即我不确定它是否错误,但看起来很有趣)。我认为你需要一个函数名而不是关键字函数,但我又不是 100% 确定这一点。

希望这能让你朝着正确的方向前进。

编辑:

现在我坐在办公桌前,我正在重新阅读您的代码,您的导出对象似乎还有另一个问题。您的导出对象如下所示

export.accessory = {
  displayName : 'string-value',
  username : 'string-value',
  pincode : 'string-value',
  services : [{array: 'of-objects'}],
  }, { // LOOKIE HERE
   // fill in the rest
  }
}

注意LOOKIE HERE 部分实际上是关闭export.accessory 对象。 , 和对象的延续是错误的。你可以把那条线去掉,它会解决这个问题。

请记住,对象需要{'key':'value'},因此您不能只在需要名称的对象中设置对象。

您可以用来帮助管理此问题的一个好技术是预先创建值,然后将它们导出,看看这个

var displayName = 'name';
var username = 'user-name';
var characteristics = [{},{},{}];
var someObject = {};
var someFunction = function () {};

export.accessory = {
  displayName : displayName,
  username : username,
  characteristics : characteristics,
  someObject : someObject,
  someFunction : someFunction
}

注意object.accessory 中每个键/值对的第一个单词(: 左侧)是键的名称,第二个单词(: 右侧)是引用您在上面创建的变量。

我希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多