2013-10-10 2 views
12

Как мне сделать функцию из этого?Как сделать 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); 
      // 
      } 
     }); 
    }); 
+0

набора 'асинхронные: false' в вашем АЯКСЕ вызова – JFK

+4

Вы не должны делать это синхронным если это вообще возможно. Синхронные вызовы AJAX блокируют все, что происходит в браузере. В идеале вам следует рассмотреть вопрос о возврате обещания от вашей функции, а затем использовать любые вызовы, которые действуют по возвращенному обещанию. –

+0

@ MichaelMior вы можете экстраполировать на обещание? Мне нравится этот способ лучше, чем создание ajax-синхронизации вызовов. –

ответ

7

Вы не должны сделать это синхронно, чтобы сделать его полезной функцией.

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); 
}); 
+0

Впервые я слышу о обещании(). Прочитайте об этом. И спасибо! –

+0

Нет проблем. обещания могут быть очень мощным инструментом, если вы понимаете, как они работают. –

+0

p.s. Я не мог заставить его работать, как вы его написали. Поэтому я обновил сообщение, чтобы включить ответ. Как вы думаете? Я получал ошибку о том, что не определяется. Когда я определил его вне ajax, он всегда возвращал false. –

5

Вы можете поставить асинхр: ложный вариант

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; 
} 
+0

Я уверен, что вы ответили прямо на мой вопрос. Но другие ответы кажутся лучшими. –

+0

Спасибо! Да, я считаю, что обещания - лучший способ пойти. Блокировка основного потока, вероятно, «плохой» – Cillier

Смежные вопросы