2017-10-29 2 views
1

私は電子メールで新しく、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

は悪いニュースは、私が電子を知らないということですので、TL;下のテキストのためのDRは、同じくらい簡単です:http.getに渡されたコールバックへconsole.logラインを入れました。


httpGetに戻り値がありません(それは正常です)。そのためログできません。 JavaScriptのイベント処理はコールバックで動作し、HTTP経由でデータを取得することはイベントです。

http.getの2番目の引数は、イベントハンドラです。

今、それは空想ラムダとして表示されますが、オールドスクールな方法で

(res)=>{...} 

それはだから

function(res){...} 

ようになりますが関数であり、何かがに発生したとき、それが呼び出されますあなたが発行したHTTPリクエストと、その結果をログに記録/掘り下げることができる場所です(res)。あなたは、現時点では、あなたのログに表示さ何

  • undefinedhttpGet
  • [function]はあなたがconsole.log
  • のための2番目の引数として渡す関数であり、何も返さない関数の戻り値であります

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

0

まず、コールバックパターンは、通常、2つのパラメータ、つまりerrresultを受け取る関数を記述するためのものです。エラーがなければerrnullになり、エラーがあった場合resultnullになります。これは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) 
    } 
}); 
関連する問題