【发布时间】:2013-10-18 13:45:09
【问题描述】:
我该如何利用这个功能?
//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 调用的异步特性,结果总是返回 false。
处理这种情况的诀窍是什么?
似乎有效:
//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);
//
}
});
});
【问题讨论】:
-
在你的ajax调用中设置
async: false -
如果可能的话,你不应该让它同步。同步 AJAX 调用会阻止浏览器中发生的任何其他事情。理想情况下,您应该考虑从您的函数返回一个 Promise,然后让该函数对返回的 Promise 执行任何调用。
-
@MichaelMior 你能推断出承诺吗?我喜欢这种方式比让 ajax 调用同步更好。
-
它会冻结你的浏览器
-
@showdev 这里的解决方案更好!
标签: javascript jquery ajax