让AJAX“获取”function同步/如何获得结果?

我遇到了$ .get函数的问题。 该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会警告null结果,因为$.get异步的

那么有什么办法可以在这个get函数之外使用xyz吗?

真正的答案是否定的 ,但您可以使用:

 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); 

但是,您必须在ajax调用之前声明xyz变量。

这是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); }); 

你必须注意它很容易编写令人困惑的代码。 要记住的一个好方法是,你可以使自己的function也接收回调。 这允许它们被不同的函数使用(就像普通的同步辅助函数一样,返回值可以由不同的函数使用)

 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)