如何使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同步? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使javascript获取同步? [复制]

处理多个文件时如何使inotify等待

如何使jquery“$ .post”请求同步[重复]

如何使输入文本字段用*替换任何字符? [复制]

ajax如何可以发送同步请求

如何将Ajax请求从异步改为同步