イベントにバインドされたメソッドが非同期で呼び出されるのか、JavaScriptで呼び出されないのか疑問に思っていますか?私の場合、Backbone.jsを使用してアプリを作成しています。ビュー間で通信するためにイベントアグリゲーターを使用します。
イベントをトリガーするメソッドがある場合、そのイベントにバインドされている他のビューのメソッドは、トリガーイベントを呼び出す残りのメソッドが実行される前に完了しますか?
イベントアグリゲーターは次のとおりです。
var eventAggrigator = _.extend({}, Backbone.Events);
eventAggrigator.on('submitContactEditForm', function() {
console.log('Contact edit form submit event triggered');
});
イベントをトリガーする関数呼び出し(この関数はViewAから呼び出されます):
saveContact: function(event) {
var self = this;
// Prevent submit event trigger from firing.
event.preventDefault();
// Trigger form submit event.
eventAggrigator.trigger('submitContactEditForm');
// Update model with form values.
this.updateContact();
// Save contact to database.
this.model.save({
success: function(model, response) {
console.log('Contact ' + self.model.get('surname') + ' saved');
},
error: function(model, response) {
throw error = new Error('Error occured while saving contact.');
}
});
},
ViewBはイベント'submitContactEditForm'にバインドされています(以下のViewBの関連コードを参照)。
initialize: function() {
_.bindAll(this, 'addSortableFields', 'appendNewField', 'getFieldsHtml', 'removeField', 'render', 'setEmailValues');
// Bind to event aggregator.
eventAggrigator.bind('submitContactEditForm', this.setEmailValues);
this.model = this.options.model;
},
setEmailValues: function() {
// Extract email form values.
var emails = _.clone(this.model.get('email'));
var emailFields = this.$('.email-field');
_.each(emails, function(email, index) {
email.value = emailFields.eq(index).val();
});
this.model.set('email', emails);
},
したがって、質問は、ViewA.saveContact()のthis.model.save()が実行される前に、ViewB.setEmailValues()が常に完了するのでしょうか。