我遇到$不用彷徨功能的问题。 URL包含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
是异步的 。
那么,有没有办法,我可以使用xyz
此get函数之外?
真正的答案是否定的,但你可以这样做:
function useXYZ(){
alert(xyz);
}
xyz = null
$.get('http://www.someurl.com/123=json', function(data) {
xyz = data.positions[0].latitude;
useXYZ();
});
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);
你必须申报xyz
Ajax调用之前变量,虽然。
这与JavaScript的常见问题。 Javascript代码必须写在延续传递风格。 它的麻烦,但它的东西,你可以不用想太多转换。
Basicaly,每当我们会碰到这样的
var x = someSyncFunction(a, b, c);
//do something with x
console.log(x);
我们可以通过使函数返回后,所有的代码放到一个连续函数和变量转向x转换成延续回调的参数,将其转换成异步代码。
someAsyncFunction(a, b, c, function(x){
//do something with x;
console.log(x);
});
你必须要小心,它很容易写的代码混乱。 一个好的技巧要记住是taht你可以让自己的函数也接收回调。 这使他们能够被用来通过不同的功能(就像正常同步辅助函数返回一个值可以由不同的功能一起使用)
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)