Как мне сделать функцию из этого?Как сделать ajax синхронным?
//check if station is alive
$.ajax({
url: "lib/grab.php",
data: "check_live=1&stream_url="+valueSelected,
type: "GET",
success: function (resp) {
if (resp == 1) {
play_this(valueSelected);
} else {
//
}
},
error: function (e) {
console.dir(e);
}
});
Я думал, что я мог бы сделать что-то вроде этого:
function is_alive(valueSelected) {
result = false;
//check if station is alive
$.ajax({
url: "lib/grab.php",
data: "check_live=1&stream_url="+valueSelected,
type: "GET",
success: function (resp) {
if (resp == 1) {
result = true;
} else {
//
}
},
error: function (e) {
console.dir(e);
}
});
return result;
}
Но, очевидно, из-за асинхронной природы Ajax вызова, результат всегда возвращает ложь.
Какая уловка в этой ситуации?
Кажется, работает:
//check if station is alive
function is_alive(url) {
//
var result = false;
//
return $.ajax({
url: "lib/grab.php",
data: "check_live=1&stream_url="+url,
type: "GET",
success: function (resp) {
if (resp == 1) {
//
result = true;
//
}
},
error: function (e) {
console.dir(e);
}
}).then(function() {
return $.Deferred(function(def) {
def.resolveWith({},[result,url]);
}).promise();
});
}
И называть это так:
//Change song on select, works both for fav and station lists
$(document).on("click", ".ui-listview li a", function(){
var valueSelected = $(this).data("station-url");
//
is_alive(valueSelected).done(function(result,url){
if (result) {
//
play_this(valueSelected);
//
}
});
});
набора 'асинхронные: false' в вашем АЯКСЕ вызова – JFK
Вы не должны делать это синхронным если это вообще возможно. Синхронные вызовы AJAX блокируют все, что происходит в браузере. В идеале вам следует рассмотреть вопрос о возврате обещания от вашей функции, а затем использовать любые вызовы, которые действуют по возвращенному обещанию. –
@ MichaelMior вы можете экстраполировать на обещание? Мне нравится этот способ лучше, чем создание ajax-синхронизации вызовов. –