Javascript 全局变量在回调函数之外不会保持不变
Javascript global variable not staying changed outside callback function
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);
}
)();
- 带有全局变量、咖啡脚本和回调的模块 CSV
- 参数化javascript中异步函数链的变量回调,jQuery
- YepNope/Modernizr 回调,包含全局 JavaScript 变量和 Internet Explorer
- 为什么在定义回调/侦听器函数(异步消息传递,port.on)后没有立即设置全局变量
- Javascript 全局变量在回调函数之外不会保持不变
- Javascript 局部和全局变量在回调函数中失去作用域
- 通过回调更新全局变量
- Javascript从另一个回调访问对象变量,而不将变量放在全局范围内
- 我该如何编写一个回调函数来更改jquery的AJAX中的全局变量
- 全局变量在回调中定义后不在作用域中
- 用更多的变量javascript封装单个变量回调函数
- 如何从indexedDB回调中安全地修改全局变量?
- Node.JS:为什么全局变量的内容会在回调函数之外消失?
- 给回调函数中的全局变量赋值并返回它[Node.js]
- jQuery Ajax Post -无法使用回调函数设置全局变量
- 全局变量是如何在javascript中工作的(回调)
- 数据源查询回调问题(调用顺序,改变全局变量的能力)
- 我的全局变量在transationsuccess回调中显示为未定义-无法找出原因
- 当作为参数传递给setTimeout回调函数时,全局变量被记录为未定义
- 从XMLHttpRequest onload回调访问全局变量