function() 不是 dojo 中的函数

function() is not a function in dojo

我在 dojo 中调用函数时遇到此错误:

TypeError: this.loadNameAndDescpFromLookup is not a function

但我不知道为什么?: 这是我的代码

readBarcodeFromMobile: function(){
        stompClient.subscribe('/topic/messages', function(event) {
            registry.byId('PId').set("value", event.body);
            this.loadNameAndDescpFromLookup(event.body); // the error is here
        });
    });
}            

loadNameAndDescpFromLookup: function(barcode){ }

有什么想法吗?

这里的问题是this

您的部分代码:

function(event) {
  if(registry.byId('productBarcodeId') != undefined){
    registry.byId('productBarcodeId').set("value", event.body);
    this.loadNameAndDescpFromLookup(event.body); // the error is here
  }
}

这里的 this 指的是 function 而不是你在其中编写整个代码的对象。 但是显然该函数没有指定的功能,因此会发生错误。


我不太确定如何正确执行此操作,但您可以使用变量来存储所需的上下文并使用变量而不是 this.

示例:

<head>
<style>
#btn1, #btn2 {
width: 200px;
height: 200px;
}
</style>
</head>
<Body>
<Button id="btn1">Working</Button>
<Button id="btn2">Error</Button>
<script>
init();
function init() {
 var currentThis = this; //Here the right this-context is stored in a variable
 document.getElementById("btn1").onclick = function() {
                  currentThis.test(); //here the var currentThis will be used to find the right scope
 }
        document.getElementById("btn2").onclick = function() {
                  this.test(); //Here an Error will occur
 }
}

function test() {
 alert("working");
}
</script>
</Body>

就像其他人指出的那样,问题是 this 没有引用您要在函数内部使用的对象。

解决方案是将 this 上下文存储在变量中,稍后再引用它。

例如

readBarcodeFromMobile: function(){
const self = this; // save the `this` context in a variable
this.socket = SockJS('/controller/Barcode');
this.sockets.push(this.socket);
stompClient = Stomp.over(this.socket);
stompClient.connect({}, function(frame) {
    stompClient.subscribe('/topic/messages', function(event) {
      if(registry.byId('productBarcodeId') != undefined){
        registry.byId('productBarcodeId').set("value", event.body);
        self.loadNameAndDescpFromLookup(event.body); // use the stored context
      }
    });
 });
} 
loadNameAndDescpFromLookup: function(barcode){ }