結論
本質
わざわざメインプロセスからラッパーを呼び出さず、XMLHttpRequest
書きましょう。
一言で
レンダラー側が終了するときは、request
を中止しなければならない。
事前知識
レンダラーウィンドウが切り替わる(終了・更新・遷移)ときは、メインプロセスとのイベントをクリアしなければならない
以下動作からの憶測
node.js
のrequest
も、メインプロセスから呼び出している以上、メインプロセスと関係がある。
なので、リクエストが完了し、レンダラープロセスで完了時の処理を行うとき、既に開放されていれば、メインプロセス側から参照先がなくなりエラーとなる。
環境
- Electron 0.37.2
- Windows 7
事象
定期的に外部にget
を行うページから別ページに移動したとき、不定期に
のエラーがでる。
対象コードは
var request = require("remote").require('request')
request.get({url: url + tag, json:true} ,function (error, response, body) {
解決
レンダラー側が終了したのにリクエストが残り、完了してしまうのが原因なので、呼び出したjsが終了するときに、通信も中断する。
発生が不定期なのでまだ確証が得られていないが、未だエラーには遭遇していない。
javascript - node.js: how to stop an already started http request - Stack Overflow
// 移動時にリクエストを中止するためのrequestの返り値
var watchRequest
var request = require("remote").require('request')
watchRequest = request.get({url: url + tag, json:true} ,function (error, response, body) {
// 中略
// リロードではcloseが呼ばれないのでだいたいこちらに書いている
window.addEventListener('beforeunload', function() {
// 通信を中断してメインプロセスがこちらを呼びだそうとさせない
watchRequest.abort()
})
なぜXMLHttpRequest
使わなかった?
多分、理解することと書くこととが面倒で、request.get()
のほうが簡単だったから…
横着の報いが無駄なイベント登録となりました。