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:false
3] -- 已加载 IAP:真
4] -- 已加载 IAP:false
1] -- 已加载 IAP:true
我按顺序返回响应。但它不是 Ajax。它通过 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
注意 - 我将 console.log 称为下面的日志
现在javascript运行文件就是这个顺序
您必须从某个地方调用“IAP_onReady”,因此
- log 4 会立即打印出来,因为它是一个非异步代码,'IAP_loaded' 的输出为 false。您已将“IAP_loaded”初始化为 false
4] -- IAP Loaded: false
- log 2 立即打印出来,因为它是一个非异步代码,var 的输出为 false,因为 'IAP_loaded' 还没有被修改
2] -- IAP Loaded: false
- log 3 会立即打印出来,因为它是非异步代码,但您已手动将“IAP_loaded”的值更改为 true
3] -- IAP Loaded: true
- 现在,在“storekit.load”执行完成后,日志 1 被打印出来,这里“IAP_loaded”的值手动设置为 true
1] -- IAP Loaded: true
请尽量提供完整的代码,如函数的调用方式等
关于Javascript 全局变量不会在回调函数之外保持更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19041845/