关于javascript:如何让ajax同步?

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