电子方法回调

时间:2017-10-29 18:27:28

标签: node.js electron

我是电子新手,并尝试构建一个应用程序来控制Mac上的智能家居组件。要做到这一点,我需要很多HTTP-Request所以我的想法是为这个工作创建一个自己的方法/函数。 现在我的问题是,我不知道如何使用这个回调东西;)

这是我现在的代码:

const {app, Tray, Menu, BrowserWindow, net} = require('electron');
const path = require('path');

const iconPath = path.join(__dirname, 'icon.png');
let appIcon = null;
let win = null;
var http = require('http');


function httpGet(url, callback) {
  http.get(url, (res) => {
    const { statusCode } = res;
    const contentType = res.headers['content-type'];
    res.setEncoding('utf8');
    let rawData = '';
    res.on('data', (chunk) => { rawData += chunk; });
    res.on('end', () => {
      return callback(rawData);
    });
  }).on('error', (e) => {
    console.error(`Got error: ${e.message}`);
  });
}


app.on('ready', function(){
  win = new BrowserWindow({show: false});
  appIcon = new Tray(iconPath);
  var contextMenu = Menu.buildFromTemplate([
    {
      label: 'http',
      click: function() {
      console.log(httpGet('http://192.168.178.10/switches/status_1'),
        function(result) {
          console.log(result);
        }
        );
      }
    }
  ]);

  appIcon.setToolTip('This is my application.');
  appIcon.setContextMenu(contextMenu);
});

Trey有效,但httpGet函数不返回任何(undefined [function])和电子崩溃。

如果有人可以帮助我,我会非常感激。

问候, 卢卡斯

2 个答案:

答案 0 :(得分:0)

坏消息是我不知道电子,所以TL; DR下面的文字简单如下:将console.log行放入传递给http.get的回调中。

<小时/> httpGet中没有返回值(这是正常的),这就是您无法记录它的原因。 JavaScript事件处理与回调一起使用,通过HTTP获取数据是一个事件。

http.get的第二个参数是事件处理程序。

虽然它现在看起来像一个奇特的lambda,

(res)=>{...}

以oldschool方式看起来像

function(res){...}

因此,这是一个函数,当您发出的HTTP请求发生某些事情时,它将被调用,这是您可以记录/挖掘结果(res)的地方。

您目前在日志中看到的内容:

  • undefined是函数的返回值,它不会返回任何内容,httpGet
  • [function]是您作为console.log
  • 的第二个参数传递的函数

function a(){} // a function which does not return anything
console.log(a(),a); // logs function result and function itself

答案 1 :(得分:0)

首先,回调模式通常是编写一个接受2个参数的函数:errresult。如果没有错误err变为null,则错误result变为null。所以这是写httpGet的最佳方式:

function httpGet(url, callback) {
  http.get(url, (res) => {
    const {
      statusCode
    } = res;
    const contentType = res.headers['content-type'];
    res.setEncoding('utf8');
    let rawData = '';
    res.on('data', (chunk) => {
      rawData += chunk;
    });
    res.on('end', () => {
      return callback(null, rawData);
    });
  }).on('error', (e) => {
    console.error(`Got error: ${e.message}`);
    return callback(e, null)
  });
}

其次,您拨打httpGet的电话的方式是错误的。改变这个:

console.log(httpGet('http://192.168.178.10/switches/status_1'),
  function(result) {
    console.log(result);
  }
);

httpGet('http://192.168.178.10/switches/status_1', function(err, rawData) {
  if (err) {
    console.error('httpGet failed!');
  } else {
    console.log(rawData)
  }
});