8

说我有这个:

view1.listenTo(model, 'change', function(){
    console.log('test1');
});

view2.listenTo(model, 'change', function(){
    console.log('test2');
});

是否保证“test1”总是先打印?

4

3 回答 3

8

我不知道听众以不同的方式工作的任何情况。我已经阅读了backboneJs 代码以确保,并且我已经看到listenTo 将回调推送到一个数组中。当事件被触发时,它会循环一个包含事件回调的数组。

var triggerEvents = function (events, args) {
    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
    switch (args.length) {
        case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;
        case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
        case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
        case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
        default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
    }
};

我想你可以确定它不会改变。事件总是以这种方式运作。当事件发生时(this.model.trigger("change") 或 this.model.set("...)),回调按定义的顺序启动,当回调启动时,执行将在下一个继续模型修改线。

于 2013-10-01T15:38:31.550 回答
4

正如@Daniel 指出的那样,文档没有说明有关事件排序的任何具体内容。

根据我的个人经验,我从未见过事件以随机顺序触发。

这个工作演示证实了这一点。

演示代码:

   var Person = Backbone.Model.extend({ 
     initialize: function(){
            console.log("Welcome to this world");
        }
   });

  var person = new Person({ name: "Thomas", age: 67, child: 'Ryan'});

   var headerView = Backbone.View.extend({    

        initialize: function() {

             this.listenTo(person, 'change', function(){
                console.log('test1');
             });      

            this.listenTo(person, 'change', function(){
                console.log('test2');
             });      

             this.listenTo(person, 'change', function(){
                console.log('test3');
             });      

            this.listenTo(person, 'change', function(){
                console.log('test4');
             });      

             this.listenTo(person, 'change', function(){
                console.log('test6');
             });      

            this.listenTo(person, 'change', function(){
                console.log('test7');
             });      

        }        
     });

   new headerView();

setInterval(function(){
    person.unset('attr');
    person.set({'attr': 'value'});
},1000)
于 2013-10-01T14:56:39.790 回答
2

在目前的实施中,我会说是的。但是,文档没有说明这一点,并且可以随时更改。

于 2013-10-01T14:16:57.187 回答