这是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);
});
你必须小心,它很容易写易混淆的代码。要牢记的一个好方法是你可以让自己的函数也接收回调。这使得他们可以使用不同的功能(就像正常的同步助手函数返回值可以通过不同的功能使用)
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)
如果您将'var'关键字移出函数并且在你的初始'xyz'前面,那么你可以在你的ajax请求完成后执行的任何函数中在该范围内的任何地方使用它。 – Paulpro
虽然* * **同步** AJAX(在jQuery中记录*),但通常应该避免*,因为它对用户体验有负面影响。相反,请专注于使用基于事件的异步AJAX模型。也就是说,在回调中用'xyz' *更新DOM。 – 2012-06-10 22:44:40
@pst。一直都有同样的问题。这一个和DOM准备好的问题。 – gdoron