私は理想的にカスタム "オブジェクト"として実行したいいくつかのJSコードを持っていますが、私はJSの性質上そうすることはできません。javascript関数/ "class"のパラメータを非同期に変更しますか?
だから私はどこかのオンラインのブログを追ってきたし、これを書かれている(エレガントおそらくないと私には思える)ソリューション:
var mongoose = require('mongoose');
var dbservice = function() {
this.connected = false;
this.connection_error = false;
this.status_messages = [];
this.connect = function() {
mongoose.connect('Laaaadeedaaaa');
var db = mongoose.connection;
db.on('error', function() {
this.status_messages.push('Nooo! Connection Error');
console.error.bind(console, 'Nooo! Connection Error: ');
this.connection_error = true;
});
db.once('open', function() {
this.status_messages.push('Successfully connected to the database!');
console.log('Successfully connected to the database!');
this.connected = true;
});
};
//DB (db.runCommand({whatsmyuri: 1}))
this.createUser = function(user_in, password_in) {
require("./data/models/user");
var User = mongoose.model('User');
var newUser = new User({ username: user_in, password: password_in, date_created: Date() });
newUser.save(function(err, data) {
if (err) {
this.status_messages.push('User creation error!');
console.log(err);
}
else {
this.status_messages.push('Success!');
console.log('Success:', data);
}
});
};
};
module.exports = dbservice;
私がようにこれを呼び出そう:
var cur_service = new dbservice();
cur_service.connect();
setTimeout(function() {
console.log("Connected!");
console.log(cur_service.connected);
},3000);
したがって、実質的にはthis.connect
が正常に実行されており、すぐに完了します(mongoose関数が非同期であるため)。約1秒後、コンソールは期待通りにSuccessfully connected to the database
を出力します。しかし、タイマーが刻々と変化すると、cur_service.connected
はまだ偽であり、私はそれをtrueに設定して非同期関数が完全に完了したので混乱します。これは、形式が非同期戻り値では適切でないことを意味します。では、どうやってこれを解決するのですか?私が気づいていない別の構文エラーがありますか?私はちょうどiOS /デスクトップ/ C++を実際にやっているので、これは本当に新しく抽象的なものなので、js開発を始めました:P
助けてくれてありがとう!
*「私は、理想的にはクラスとして実行したいJSコードをいくつか持っていますが、明らかにJSのために実行できません。」* - ごめんなさい、何ですか? – Tomalak
私はあなたの最初の文を理解していません。それ以外に、あなたが最終的に達成しようとしていることは完全にはっきりしていません。 JSでの* this *の使用がおそらくあなたが慣れていたものではないことを理解する必要もあります。 –
ここには多くの問題があります。'this'は、新しいオブジェクトの作成ではなく、単純な関数呼び出しであれば、' dbservice() 'に有用な値を持たないでしょう。そして、 'this'はコールバック関数では通常は保持されないので、すべてのコールバック関数で失われます。 – jfriend00