在响应完成之前阻止javascript执行

在响应完成之前阻止javascript执行,javascript,asynchronous,callback,synchronous,Javascript,Asynchronous,Callback,Synchronous,我有js代码,它为我的表返回数据行。单击这些行中的每一行,它们展开并计划通过调用另一个ajax请求来显示该行的子数据 我的子数据代码如下所示: function format ( d ) { var results; $.ajax({ url: 'http://127.0.0.1:7101/MUDRESTService/rest/v1/feedbacks/' + d.FeedbackId + '/child/MudFeedbackDetailsVO?onlyData=t

我有js代码,它为我的表返回数据行。单击这些行中的每一行,它们展开并计划通过调用另一个ajax请求来显示该行的子数据

我的子数据代码如下所示:

function format ( d ) {
    var results;
    $.ajax({ url: 'http://127.0.0.1:7101/MUDRESTService/rest/v1/feedbacks/' + 
    d.FeedbackId + '/child/MudFeedbackDetailsVO?onlyData=true',
            
             type: 'get',  
             dataType: 'json',    
             success: function(output) {
    console.log(output.items[0].CriticalPath) ; 
                        results =      output.items[0];        
                }
       
           });
    return  results.CriticalPath;
}
问题可能是方法没有在results.CriticalPath的时间值之前完成。我可以在ChromeJS控制台中看到值,所以数据部分没有问题


那么,我应该如何让它在响应就绪后返回值呢?在编写异步代码时,您需要开始使用回调而不是返回值

您的函数,如此处的
格式
,只会启动一个操作。对UI的更新由回调启动

而不是这种逻辑:

function doSomething() {
   var result = format(d);
   doSomethingWithResult(result);
}
您需要适应以下情况:

function doSomething() {
   var result = format(d, doSomethingWithResult);
}

function format( d, callback ) {
   $.ajax(..., { 
      success : function(output) {

          var results = output.items[0];
          callback(results); // this is where we call doSomethingWithResult

      }
   });
}

现在我不想在这方面下功夫,但希望您能从代码示例中找到一些可以使用的东西

我将绑定.done()-函数上的每一行,该函数调用另一个api。我希望这有帮助

(函数(){
//getJSON示例
var jqxhr=$.getJSON(“https://api.myjson.com/bins/2emll“,函数(数据){
用于(输入数据){
$(“#list”).append(“
  • “+data[key]+”
  • ”); } }).完成(功能(数据){ $(“#列表li”)。在(“单击”上,函数(e){ var target=e.target.className; //ajax示例 $.ajax({ 网址:'https://api.myjson.com/bins/309x5', 键入:“get”, 数据:目标, 数据类型:“json”, 成功:功能(数据){ var title=$(“+target).text(); $(“+target).html(title+”
      ); } }).完成(功能(数据){ 用于(输入数据){ $(“#ul-”+target).append(“
    • ”+data[key]+”
    • ”); } }); }); }); })();
      您可以尝试将
      async
      选项设置为false

      像这样

      function format ( d )     
      {  
         var results;
         $.ajax({ 
                   url: 'http://127.0.0.1:7101/MUDRESTService/rest/v1/feedbacks/' +   d.FeedbackId + '/child/MudFeedbackDetailsVO?onlyData=true',
                   type: 'get',
                   dataType: 'json',
                   async:false,    
                   success: function(output) 
                      {
                          console.log(output.items[0].CriticalPath) ; 
                          results =      output.items[0];        
                  }
             });
      return  results.CriticalPath;
      }
      
      注: 但是它会使您的ajax同步,并且您的浏览器可能对请求没有响应,因此在使用它之前需要注意一些要点

      默认情况下,所有请求都是异步发送的(即,默认情况下设置为true)。如果需要同步请求,请将此选项设置为false。跨域请求和数据类型:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。从jQuery1.8开始,不推荐在jqXHR($.Deferred)中使用async:false;您必须使用success/error/complete回调选项,而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()

      Ajax中的第一个字母代表“异步”,这意味着操作并行进行,并且不能保证完成的顺序。$.ajax()的async选项默认为true,表示发出请求后可以继续执行代码。强烈反对将此选项设置为false(从而使调用不再异步),因为这会导致浏览器无响应


      您可以阅读更多信息

      使用
      承诺
      也许?我也在寻找暂停代码或等待结果的方法,但我担心这可能不可能或几乎不可能。异步代码是在执行所有同步代码之后执行的,因此这将非常复杂。不,你真的不想阻止javascript执行并冻结页面。如果OP,像我一样,不喜欢?不,我可以打电话back@Vik也许在一个只有其中几个的小应用程序中就可以了。@ThisNameBetterBeAvailable:您链接的文章包含了如何避免混乱回调代码的答案。我不是在这里评论样式。OP有一个非常具体的错误,回调就是解决方法。避免回调地狱并不是不使用回调,而是以一种不混乱的方式编写回调。你永远不想用长时间运行的操作来阻止UI线程。@DavidHedlund好的,那么我误解了这个问题。我以为OP想要阻止一个非阻塞呼叫。对不起,我完全是个初学者。你能用我上面的代码来写吗?OP要求的是阻止非阻塞异步代码执行,而不是阻止异步代码执行后如何执行。另外,他想暂停代码并等待结果,他可能不想。我已经更新了我的答案并发布了一个JS fiddle演示
      function format ( d )     
      {  
         var results;
         $.ajax({ 
                   url: 'http://127.0.0.1:7101/MUDRESTService/rest/v1/feedbacks/' +   d.FeedbackId + '/child/MudFeedbackDetailsVO?onlyData=true',
                   type: 'get',
                   dataType: 'json',
                   async:false,    
                   success: function(output) 
                      {
                          console.log(output.items[0].CriticalPath) ; 
                          results =      output.items[0];        
                  }
             });
      return  results.CriticalPath;
      }