3
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

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

4

2 回答 2

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”,因此

  • 日志 4 会立即打印,因为它是一个非异步代码,输出“IAP_loaded”为假。您已将“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 已加载:真

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

于 2013-10-11T14:57:34.703 回答
0

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

(function check_IAP(){
    console.log("5] -- IAP Loaded: "+IAP_loaded);
    if (!IAP_loaded) {
        setTimeout(check_IAP,500);
    }
)();
于 2013-10-11T15:46:38.330 回答