让AJAX“获取”功能同步/如何得到的结果?(Make AJAX “get” function sy

2019-06-25 09:57发布

我遇到$不用彷徨功能的问题。 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函数之外?

Answer 1:

真正的答案是否定的,但你可以这样做:

function useXYZ(){
    alert(xyz);
}

xyz = null        

$.get('http://www.someurl.com/123=json', function(data) {
   xyz = data.positions[0].latitude;
   useXYZ();
});


Answer 2:

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调用之前变量,虽然。



Answer 3:

这与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)



文章来源: Make AJAX “get” function synchronous / how to get the result?