init
としてresolve
というサービスを提供しています。まず、接続のIDを持つフォルダを作成し、そこにいくつかのデフォルトファイルを書き出します。 this.dir
の目的であるフォルダ(つまり、接続のID)を記録する必要があります。約束としてのソケット
次のコードは、よくinitDir
を呼び出します。ただし、initFiles
は呼び出されません(つまり、alert("here")
は呼び出されません)。私はそれがinitDir
が約束としてうまく作られなかったからだと思います。
誰もそれを修正する方法を知っていますか?サーバー側では
this.files = [ ... ... ];
this.dir = "public/tmp/default/";
this.initDir = function() {
var socket = io.connect();
return socket.on('id', function (id) {
var dir = "public/tmp/" + id + "/";
return $http.post('mkdir', { dir: dir })
.then(function() {
this.dir = dir;
})
})
}
this.initFiles = function (dir, files) {
return $http.post('writeFile', { dir: dir, file: files[0] })
.then(function (res) {
$http.post('writeFile', { dir: dir, file: files[1] })
.then(function (res) {
console.log("saved 2 files")
})
})
})
}
this.init = function() {
return this.initDir()
.then(function (res) {
alert("here");
this.initFiles(this.dir, this.files)
})
}
、それだけですべての接続の後に接続IDを送信します。
io.sockets.on('connection', function (socket) {
socket.emit('id', socket.id);
}
を編集1: @epiquerasの答えに続いて、私は、コードを変更しました。次のコードは、しかし、それはinside initDir
を呼び出すことはありません、inside init
を呼び出します....
var dirP = "public/tmp/default/";
this.initDir = function() {
return new Promise(function (resolve, reject) {
alert("inside initDir")
var socket = io.connect();
socket.on('id', function (id) {
var dir = "public/tmp/" + id + "/";
$http.post('mkdir', { dir: dir })
.then(function() {
dirP = dir;
resolve(dirP)
})
})
})
}
this.init = function (files) {
alert("inside init");
return initDir
.then(function (dir) {
alert("before initFiles");
this.initFiles(dir, files)
})
}
編集2:this.initDir().then
にinitDir.then
を変更した後、私は次のコードを持っています。それはよくinside init
,inside initDir
,before initFiles
を示します。ただし、inside initFiles
を表示したり、ファイルを書き込んだりしません。
this.initDir = function() {
return new Promise(function (resolve, reject) {
console.log("inside initDir")
var socket = io.connect();
socket.on('id', function (id) {
var dir = "public/tmp/" + id + "/";
$http.post('mkdir', { dir: dir })
.then(function() {
dirP = dir;
resolve(dirP)
})
})
})
};
this.initFiles = function (dir, files) {
console.log("initFiles: " + dir);
return $http.post('writeFile', { dir: dir, file: files[0] })
.then(function (res) {
$http.post('writeFile', { dir: dir, file: files[1] })
.then(function (res) {
console.log("saved 2 files")
})
})
})
}
this.init = function (files) {
console.log("inside init");
return this.initDir().then(function (dir) {
console.log("before initFiles " + dir + JSON.stringify(files));
this.initFiles(dir, files)
})
};
'initDir'の中に' this.dir'に値を代入すれば、それはサービスに記録されますか?約束と価値(すなわち、「dir」)を返すことは可能であり、良い習慣ですか? – SoftTimur
".then"コールバック内の "this"は、外部 "this.dir"と同じオブジェクトを参照しません。 「this」は、関数が代わって呼び出されるオブジェクトを指します。この場合、おそらく約束の実装のハンドラオブジェクトによって呼び出されます。グローバル変数または静的変数を使用する方が良いでしょう。 – epiqueras
ランタイムツールまたはビルドツールがES6をサポートしている場合は、矢印機能を使用します。矢印関数は、定義されている場所の "this"を保持します。 – epiqueras