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

时间:2013-09-27 02:39:19

标签: javascript function cordova callback global-variables

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

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

PS。这是一个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

我按顺序取回了回复。但它不是Ajax。通过Objective C,javascript只处理响应,因此可以通过javascript编辑

2 个答案:

答案 0 :(得分:1)

正如所建议的那样(在应用程序购买中)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

注意 - 我将console.log称为下面的日志

现在javascript运行文件就是这个命令

你必须从某个地方调用'IAP_onReady',因此

  • log 4立即打印,因为它是非asyn代码,输出'IAP_loaded'为false。您已将'IAP_loaded'初始化为false
  

4] - IAP已加载:false

  • log 2立即打印,因为它是非asyn代码,输出var为false,因为'IAP_loaded'尚未修改
  

2] - IAP已加载:false

  • log 3会立即打印,因为它是非asyn代码,但您已将'IAP_loaded'的值手动更改为true
  

3] - IAP已加载:是

  • 现在'storekit.load'执行完毕后,打印了log 1,并将此处'IAP_loaded'的值手动设为true
  

1] - IAP已加载:是

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

答案 1 :(得分:0)

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

之后在底部添加此测试
(function check_IAP(){
    console.log("5] -- IAP Loaded: "+IAP_loaded);
    if (!IAP_loaded) {
        setTimeout(check_IAP,500);
    }
)();