方法是否绑定到Javascript / Backbone.js中异步或非异步调用的事件?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了方法是否绑定到Javascript / Backbone.js中异步或非异步调用的事件?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2547字,纯文字阅读大概需要4分钟。
内容图文
![方法是否绑定到Javascript / Backbone.js中异步或非异步调用的事件?](/upload/InfoBanner/zyjiaocheng/792/3d12170d94654bf69e90809a9937426b.jpg)
我想知道绑定到事件的方法是否在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()之前完成吗?
解决方法:
在骨干中触发事件的相关部分是:
trigger: function(events) {
var event, node, calls, tail, args, all, rest;
if (!(calls = this._callbacks)) return this;
all = calls.all;
events = events.split(eventSplitter);
rest = slice.call(arguments, 1);
// For each event, walk through the linked list of callbacks twice,
// first to trigger the event, then to trigger any `"all"` callbacks.
while (event = events.shift()) {
if (node = calls[event]) {
tail = node.tail;
while ((node = node.next) !== tail) {
node.callback.apply(node.context || this, rest);
}
}
if (node = all) {
tail = node.tail;
args = [event].concat(rest);
while ((node = node.next) !== tail) {
node.callback.apply(node.context || this, args);
}
}
}
return this;
}
如您所见,事件处理程序是逐个同步调用的.
警告:如果您的处理程序进行异步调用,那么当然在执行堆栈在触发后继续执行之前,这些将无法保证完成.这可以通过使用将通过使用延迟/承诺触发完成或更好的回调来缓解.
内容总结
以上是互联网集市为您收集整理的方法是否绑定到Javascript / Backbone.js中异步或非异步调用的事件?全部内容,希望文章能够帮你解决方法是否绑定到Javascript / Backbone.js中异步或非异步调用的事件?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。