how to make ajax synchronous?
本问题已经有最佳答案,请猛点这里访问。
我该如何利用这个功能呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | //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); } }); |
我想我可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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。
处理这种情况的诀窍是什么?
似乎起作用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | //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(); }); } |
这样称呼它:
1 2 3 4 5 6 7 8 9 10 11 12 | //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); // } }); }); |
您不必使它同步,就可以使它成为一个有用的函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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); }); |
您可以提供async:false选项
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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; } |