阻止javascript执行直到响应完成

时间:2015-11-20 08:37:15

标签: 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=true',
            
             type: 'get',  
             dataType: 'json',    
             success: function(output) {
    console.log(output.items[0].CriticalPath) ; 
                        results =      output.items[0];        
                }
       
           });
    return  results.CriticalPath;
}

问题可能是方法没有按结果的时间值完成。返回了CrititPath。我可以在chrome js控制台中看到值,因此数据部分没有问题。

那么一旦响应准备就绪,我应该如何让它返回值

3 个答案:

答案 0 :(得分:1)

编写异步代码时,需要开始使用回调而不是返回值。

您的功能(如format此处)仅启动操作。 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

      }
   });
}

答案 1 :(得分:1)

现在我没有对此发挥作用,但希望您能从代码示例中找到可以使用的内容。

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

JS-FIDDLE

(function(){
    //getJSON example
    var jqxhr = $.getJSON( "https://api.myjson.com/bins/2emll", function(data) { 

        for (key in data) {
            $("#list").append("<li class='" + key + "'>" + data[key] + "</li>");
        }

    }).done(function( data ) {

        $("#list li").on("click", function(e){

            var target = e.target.className;

            //ajax example
             $.ajax({ 
                url: 'https://api.myjson.com/bins/309x5',         
                type: 'get',
                data: target,
                dataType: 'json',    
                success: function(data) {
                    var title = $("." + target).text();
                    $("." + target).html(title + '<ul id="ul-' + target + '"></ul>'); 
                }

           }).done(function(data){

                for (key in data) {
                    $("#ul-" + target).append("<li class='" + key + "'>" + data[key] + "</li>");
                }

           });

        });
    });
})();

答案 2 :(得分:0)

您可以尝试将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。跨域请求和dataType:“jsonp”请求不支持同步操作。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。从jQuery 1.8开始,不推荐使用async:false和jqXHR($ .Deferred);您必须使用success / error / complete回调选项而不是jqXHR对象的相应方法,例如jqXHR.done()或不推荐使用的jqXHR.success()。

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

您可以阅读更多信息here