如何使ajax同步? [复制]
Posted
技术标签:
【中文标题】如何使ajax同步? [复制]【英文标题】:how to make ajax synchronous? [duplicate] 【发布时间】: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 这里的解决方案更好!
【参考方案1】:
您不必使其同步即可使其成为有用的功能。
function is_alive(valueSelected)
//check if station is alive
return $.ajax(
url: "lib/grab.php",
data: "check_live=1&stream_url=" + valueSelected,
type: "GET",
error: function (e)
console.dir(e);
).then(function (resp)
return $.Deferred(function(def)
def.resolveWith(,[resp == 1,valueSelected]);
).promise();
);
is_alive(somevalue).done(function(result,valueSelected)
alert(result);
alert(valueSelected);
);
【讨论】:
第一次听说 promise()。会读到那个。谢谢! 没问题。如果你了解它们的工作原理,promise 可以成为一个非常强大的工具。 附注我无法让它像你写的那样工作。所以我更新了我的帖子以包括答案。你怎么看?我收到关于 resp 未定义的错误。当我在 ajax 之外定义它时,它总是返回 false。 如果不使其同步,您仍然无法以有意义的方式在回调之外获取该值。你不能。不要尝试。 你错过了四个非常重要的角色:).then(function(resp)
公平地说,我也错过了他们。对不起!更新的答案。【参考方案2】:
您可以提供 async: false 选项
function is_alive(valueSelected)
result = false;
//check if station is alive
$.ajax(
async: false,
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同步? [复制]的主要内容,如果未能解决你的问题,请参考以下文章