Javascript 全局变量在回调函数之外不会保持不变

Javascript global variable not staying changed outside callback function

本文关键字:全局变量 回调 函数 Javascript      更新时间:2023-09-26
var IAP_loaded = false; // Global Scope
var IAP_onReady = function(){
     storekit.load(IAP_list, function (products, invalidIds) {
            IAP_loaded = true;
            console.log("1] -- IAP Loaded: "+IAP_loaded); // Outputs true
     });
     console.log("2] -- IAP Loaded: "+IAP_loaded); // Outputs false
     IAP_loaded = true;
     console.log("3] -- IAP Loaded: "+IAP_loaded); // Outputs true
};
console.log("4] -- IAP Loaded: "+IAP_loaded); // Outputs false

对于某些人来说,我的全局变量没有在函数本身之外保持修改......我创建了一个完全独立的函数并更改了一个全局变量,它工作正常。这个头脑让我感到困惑。有什么想法吗?

附言。这是一个Phonegap 3.0项目,回调函数来自IAP插件。在这里找到 https://github.com/j3k0/PhoneGap-InAppPurchase-iOS

storekit.load 是异步的!感谢您缩小范围。

2] -- IAP Loaded: false 3] -- IAP Loaded: true 4] -- IAP Loaded: false 1] -- IAP Loaded: true

我按该顺序返回响应。但这不是阿贾克斯。它是通过Objective C,javascript只处理响应,所以它可以通过javascript进行编辑。

正如建议的那样,IAP(在应用购买中(的工作方式类似于Ajax。事实上,大多数Phonegap插件都遵循相同的模式。

首先让我们看看插件是如何工作的- 来自JS的调用被发送到Obj C文件- 当 Obj C 正在执行所需的计算时,其他 JS 代码并同时运行- 在 Obj C 完成计算后,输出通过回调发送回 JS

现在让我们尝试查看您提供的代码

var IAP_loaded = false; // Global Scope
var IAP_onReady = function(){
     storekit.load(IAP_list, function (products, invalidIds) {
            IAP_loaded = true;
            console.log("1] -- IAP Loaded: "+IAP_loaded); // Outputs true
     });
     console.log("2] -- IAP Loaded: "+IAP_loaded); // Outputs false
     IAP_loaded = true;
     console.log("3] -- IAP Loaded: "+IAP_loaded); // Outputs true
};
console.log("4] -- IAP Loaded: "+IAP_loaded); // Outputs false

注意 - 我指的是控制台.log如下日志

现在javascript运行文件是这个顺序

您必须从某个地方呼叫"IAP_onReady",因此

  • 日志 4 会立即打印,因为它是非异步代码,输出"IAP_loaded"为 false。您已将"IAP_loaded"初始化为假

4] -- IAP 已加载:假

  • 日志 2 立即打印,因为它是非异步代码,变量的输出为 false,因为"IAP_loaded"尚未修改

2] -- IAP 已加载:假

  • 日志 3 会立即打印,因为它是非异步代码,但您已手动将"IAP_loaded"的值更改为 true

3] -- IAP 已加载:真

  • 现在,在"storekit.load"执行完成后,将打印日志1,并且此处的值"IAP_loaded"手动变为true

1] -- IAP 已加载:真

请尝试向我们提供完整的代码,例如如何调用函数等。

与任何异步代码一样,IAP_loaded确实更改为 true,但不是在底部代码执行之前。要检查这一点,请在 4 之后的底部添加此测试:

(function check_IAP(){
    console.log("5] -- IAP Loaded: "+IAP_loaded);
    if (!IAP_loaded) {
        setTimeout(check_IAP,500);
    }
)();