Ответ 1
Реальный ответ НЕТ, но вы можете использовать это:
function useXYZ(){
alert(xyz);
}
xyz = null
$.get('http://www.someurl.com/123=json', function(data) {
xyz = data.positions[0].latitude;
useXYZ();
});
У меня проблема с функцией $.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?
Реальный ответ НЕТ, но вы можете использовать это:
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 должен быть написан в стиле продолжения прохождения. Его раздражает, но это то, что вы можете преобразовать, не думая слишком много.
В основном, всякий раз, когда у нас будет что-то вроде
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)