Сделать функцию AJAX "получить" синхронной/как получить результат?

У меня проблема с функцией $.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 будет предупреждать нулевой результат, потому что $.get асинхронный.

Итак, можно ли использовать xyz вне этой функции get?

Ответы

Ответ 1

Реальный ответ НЕТ, но вы можете использовать это:

function useXYZ(){
    alert(xyz);
}

xyz = null        

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

Ответ 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.

Ответ 3

Это обычная проблема с Javascript. Код Javascript должен быть написан в стиле продолжения прохождения. Его раздражает, но это то, что вы можете преобразовать, не думая слишком много.

В основном, всякий раз, когда у нас будет что-то вроде

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 из функции на вызовы функции обратного вызова. Думайте, что функция async никогда не возвращалась, и единственный способ вернуть кому-то значение - передать это значение обратному вызову.


Вы можете спросить, почему нет более простого способа сделать все это. Ну, нет, если вы не используете другой язык вместо Javascript (или, по крайней мере, что-то, что позволяет вам писать асинхронный код в синхронном стиле, но автоматически компилируется до обычного Javascript)