我遇到了$ .get函数的问题。 该网址包含JSON
我的代码:
xyz = null
$.get('http://www.someurl.com/123=json', function(data) {
var xyz = data.positions[0].latitude;
});
alert(xyz);
//some more code using xyz variable
我知道xyz
会提醒空结果,因为$.get
异步。
那么有什么办法可以在这个get函数之外使用xyz
吗?
答案 0 :(得分:23)
get
是一种捷径。您可以使用以下方式执行相同操作,但同步:
var xyz = null
$.ajax({ url: 'http://www.someurl.com/123=json',
async: false,
dataType: 'json',
success: function(data) {
xyz = data.positions[0].latitude;
}
});
alert(xyz);
但是,您必须在ajax调用之前声明xyz
变量。
答案 1 :(得分:7)
真正的答案是否,但你可以使用它:
function useXYZ(){
alert(xyz);
}
xyz = null
$.get('http://www.someurl.com/123=json', function(data) {
xyz = data.positions[0].latitude;
useXYZ();
});
答案 2 :(得分:4)
这是Javascript的常见问题。 Javascript代码必须以延续传递方式编写。它令人烦恼,但它可以转换而不必过多考虑。
基本上,每当我们有类似
的东西时var x = someSyncFunction(a, b, c);
//do something with x
console.log(x);
我们可以通过使函数之后的所有代码返回到延续函数并将x从变量转换为continuation回调的参数来将其转换为异步代码。
someAsyncFunction(a, b, c, function(x){
//do something with x;
console.log(x);
});
你必须注意它很容易编写令人困惑的代码。要记住的一个好方法是,你可以使自己的功能也接收回调。这允许它们被不同的函数使用(就像恢复值的普通同步辅助函数可以被不同的函数使用)
var getXyz = function(onResult){ //async functions that return do so via callbacks
//you can also another callback for errors (kind of analogous to throw)
$.get('http://www.someurl.com/123=json', function(data) {
var xyz = data.positions[0].latitude;
onResult(xyz); //instead of writing "return xyz", we pass x to the callback explicitely.
});
};
getXyz(function(xyz){ //this would look like "var xyz = getXyz();" if it were sync code instead.
console.log('got xyz');
});
这里的技巧是将函数中的所有return语句更改为对回调函数的调用。认为好像异步函数永远不会返回,并且将值返回给某人的唯一方法是将该值传递给回调。
您可能会问为什么没有更简单的方法来完成所有这些工作。好吧,没有,除非你使用另一种语言而不是Javascript(或者至少可以让你以同步方式编写异步代码,但会自动编译为常规Javascript)