我无法理解为什么我的代码运行不正常。也就是说,我对函数运行后foo.bar
为undefined
的原因感到困惑,但是在函数中定义了。
function async(foo, n) {
console.log("getting value number: " + n);
$.getJSON("database.json", function(data) {
foo.bar = data.value[n];
console.log(foo.bar); // this works
});
}
//////////////////////////////////////////////////////////
var foo = new String();
async(foo, 0);
console.log(foo.bar); // doesn't work
javascript控制台输出以下内容:
>getting stop number: 0
>undefined
>defined
答案 0 :(得分:1)
$.getJSON
将异步运行回调。也就是说它是非阻塞的,并且只会在收到响应之后运行回调,这是在所有其他代码运行之后。
答案 1 :(得分:0)
<强>更新强>
function async(foo, n) {
// «foo» is a parameter that only exists in the context of the function «async()», the same way for «n».
console.log("getting value number: " + n);
$.getJSON( "database.json", function(data) {
// Dynamically, the Javascript engine foo is interpreted as an object, because your result is an object with a specific value.
foo.bar = data.value[n];
// You're overwriting foo parameter with the new result. (data.value[n]).
// Then
console.log(foo.bar); // this works!
});
}
和
var foo = new String();
foo 是String的原始对象。
当你这样做时:
console.log(foo);
你在控制台中得到这个:
String {length: 0, [[PrimitiveValue]]: ""}
在这一行:
async(foo, 0);
您正在使用String的原始对象和«0»作为参数调用异步函数。
使用正确的解决方案进行了更新:
默认情况下,变量的最终值取决于 异步或同步请求,将与完成 请求完成时的期望值。这取决于 来自服务器的响应。
您需要等待服务器的响应来分配变量 用最终值然后显示它。
你应该试试这个:
var foo = {}; // Declare an object.
foo.bar; // Add bar attribute in this object.
function async(n) {
console.log("getting value number: " + n);
$.getJSON("database.json", function (data) {
foo.bar = data.value[n]; // foo.bar has a new value from the Asynchronous request.
printResult(); // Call printResult function to print in the console.
});
}
function printResult() {
console.log(foo.bar);
}
// Execute async function.
async(0);