我是电子新手,并尝试构建一个应用程序来控制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])
和电子崩溃。
如果有人可以帮助我,我会非常感激。
问候, 卢卡斯
答案 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个参数的函数:err
和result
。如果没有错误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)
}
});