繁体   English   中英

如何知道何时将新值分配给回调函数(JavaScript)中的全局变量

[英]How to know when the new value is assigned to global variable in callback function (JavaScript)

是否有什么技巧可以知道何时将新值分配给JavaScript的回调函数中的全局变量。 正如我在此处阅读的那样,它是异步的,因此JavaScript不会等到收到响应。 我需要Java代码中的新值,该Java代码在html页面中运行JavaScript代码。

没有技巧,因为您不能以尝试编写代码的方式编写代码。 您不想将数据放入全局变量,然后尝试神奇地发现数据何时存在。 那不是编写异步代码的好方法。

相反,您需要将使用异步调用结果的代码放在实际的回调本身中,或者从回调中调用某些函数并将其传递给数据。


您没有显示实际的代码,但这是使用jQuery Ajax的示例(仅出于示例目的,您可以使用任何代码或库来执行此操作):

$.ajax({
  type: "POST",
  url: "some.php",
  data: { name: "John", location: "Boston" },
  success: function(data) {
      // the results of the ajax call are here in the data argument 
      //    to this callback function
      // you can either use the data here (write any code here that needs to use it)
      // or you can call some other function and pass it the data
  }
});

需要访问该变量的代码必须在回调内; 否则,该变量尚未被赋值。

因此,您需要从回调中触发Java代码。 很难在没有更多信息的情况下提供答案。

var callbackFunction = function(arg, callback) {
    if ('an error') {
        callback(new Error('error text'));
    }
    else {
        // set the global variable
        callback(null, 'result');
    }
};

var callingFunction = function() {
    callbackFunction('arg', function(err, result) {
       if (!err) {
           // Global variable is set
           // Trigger call to Java
       }
    });
};

不,没有直接的可能性。

一种可能的解决方案是实现观察者模式或使用诸如骨干之类的东西,其中模型触发状态变化的事件。

另一种可能的解决方案是使用期货或诺言 Q提供了一种可能的方法。

您可以将全局变量定义为对象实例:

var globalVar = { 
                  _val: null, 
                  changed: function () { 
                    alert(1); 
                  }, 
                  setValue: function(val) { 
                    _val = val; this.changed(); 
                  }, 
                  getValue: function() { 
                    return _val; 
                  } 
                };

使用setValue和getValue设置并获取ur全局变量的值:

globalVar.setValue(45); // will set the value and throw an alert box. 
globalVar.getValue(); // will return 45 

因此,您可以使用自己的函数初始化“更改”的道具,如果调用“ setValue”,它将被触发

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM