我想知道绑定到事件的方法是否在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);
},
所以问题是, ViewB.setEmailValues() 是否总是在 ViewA.saveContact() 中的 this.model.save() 执行之前完成?