gpt4 book ai didi

javascript - 在 Javascript/Backbone.js 中,方法是否绑定(bind)到异步调用的事件?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:49:40 25 4
gpt4 key购买 nike

我想知道绑定(bind)到事件的方法是否在 javascript 中被异步调用?在我的例子中,我使用 Backbone.js 来构建一个应用程序。我使用事件聚合器在 View 之间进行通信。

如果我有一个触发事件的方法,绑定(bind)到该事件的其他 View 中的方法是否会在调用触发事件的方法的其余部分运行之前完成?

事件聚合器如下:

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 绑定(bind)到事件“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;
}

如您所见,事件处理程序是一个接一个地同步调用的。

警告:如果您的处理程序进行异步调用,那么在 trigger 之后执行堆栈继续之前,当然不能保证完成这些调用。这可以通过使用触发完成的回调来缓解,或者通过使用 Deferred/Promises 更好。

关于javascript - 在 Javascript/Backbone.js 中,方法是否绑定(bind)到异步调用的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10909224/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com