【问题标题】:Javascript global variable not staying changed outside callback functionJavascript全局变量不会在回调函数之外保持变化
【发布时间】:2013-09-27 02:39:19
【问题描述】:
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进行编辑

【问题讨论】:

  • 如果 storekit.load 是 AJAX 调用,请参见此处 stackoverflow.com/questions/14220321/…
  • storekit.load 是异步的!感谢您缩小范围。 2] -- IAP Loaded: false 3] -- IAP Loaded: true 4] -- IAP Loaded: false 1] -- IAP Loaded: true 我按此顺序收到回复。但它不是阿贾克斯。它通过Objective C,javascript只处理响应,因此可以通过javascript编辑
  • 对,但同样的概念也适用。了解解决方案,而不是语言。
  • IAP_onReady 在哪里被调用?看起来这段代码在调用它之后运行,在这种情况下,您将再次将IAP_loaded 设置为false,您看到的输出将是正确的。
  • 使用"use strict",你会抛出错误,这将帮助你确定如何解决你的问题。

标签: javascript function cordova callback global-variables


【解决方案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 会立即打印,因为它是一个非异步代码,“IAP_loaded”的输出为 false。您已将“IAP_loaded”初始化为 false

4] -- 已加载 IAP:错误

  • 日志 2 被立即打印,因为它是一个非异步代码,var 的输出为 false,因为仍然 'IAP_loaded' 尚未修改

2] -- 已加载 IAP:错误

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

3] -- IAP 已加载:true

  • 现在,在“storekit.load”执行完成后,会打印日志 1,并且此处的“IAP_loaded”值手动设置为 true

1] -- IAP 已加载:true

请尽量提供完整的代码,如函数调用方式等。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      相关资源
      最近更新 更多