Backbone.js触发事件阻塞后续语句

Backbone.js trigger event blocks the subsequent statement

 obj1.listen(obj2, 'save', function(t) {
   t.preventDefault()
 })
 obj2 = {
   save: function save(a) {

     var saveOrNot = !1;
     this.trigger("save", {
       preventDefault: function() {
         saveOrNot = !0
       }
     });

     console.log("prevent default after")
     if (!saveOrNot) {
       console.log("got excuted")
     }

   }
 }

在我看来,触发行之后的行总是被执行,因为 preventDefault() 不会立即被执行。 但是 "got executed" 消息不会打印出来。触发事件时代码是否挂起?

它没有被执行,因为每次当你 运行 preventDefault 函数时你将 saveOrNot 值设置为 true,但是当你检查这个值条件时它是始终为 false,因此永远不会执行控制台日志。

if (!saveOrNot) { // this is the line in scope => this is always false
    console.log("got excuted")
}

如果您想将值条件更改为相反的状态,最好使用否定:

saveOrNot = !saveOrNot;

我将按以下方式重写您的代码:

obj1.listen(obj2, 'save', function(t) {
   t.preventDefault()
 })
 obj2 = {
   save: function save(a) {

     var saveOrNot = 0;
     this.trigger("save", {
       preventDefault: function() {
         saveOrNot = !saveOrNot;
       }
     });

     console.log("prevent default after")
     if (!saveOrNot) {
       console.log("got excuted")
     }

   }
 }