【问题标题】:how do I defer javascript execution until an asynchronous method completes execution如何推迟 javascript 执行,直到异步方法完成执行
【发布时间】:2014-08-03 13:56:12
【问题描述】:

我一直在研究 Jquery 的 when thendeferred 关键字和函数,但我不知道如何将它们应用于其中之一的 ready() 函数中的简单第三方异步回调方法我的看法。

实际发生的情况是,我的视图在没有数据的情况下获得了 loaded,因为数据应该是从 ready() 中该异步方法的完成执行中填充的,但在异步回调方法之前视图是 loaded输入它的回调方法。我在该回调方法中设置了一个警报,并且它永远不会弹出,因为页面在完全加载后离开了脚本。

与此相关,我也一直在研究 jQuery.holdReady()。我有点想知道如何在这个设计中实现同步。

这就是它的样子。

$( document ).ready(function() {
   var xmlRequest = $('#requestStringHiddenField').val();
   var action = "getListOfReservations";
   asynchronousCallbackCall(xmlRequest, "callbackMethod", action);
}); 

function callbackMethod(result) {
     //unreachable      
     alert(result);
}

感谢任何帮助。

【问题讨论】:

    标签: javascript jquery jquery-deferred document-ready .when


    【解决方案1】:

    如果asynchronousCallbackCall 的第二个和第三个参数是回调函数,您应该传递函数本身,而不是它们的名称作为字符串:

    var action = getListOfReservations;
    asynchronousCallbackCall(xmlRequest, callbackMethod, action);
    

    【讨论】:

    • 视图最终加载为空而不等待异步回调调用完成。
    • 这就是异步调用的工作方式。它们立即返回,并在完成时调用回调。
    【解决方案2】:

    使用同步调用而不是异步。同步请求等待调用完成后再执行下一段代码。

    var request = new XMLHttpRequest();
    request.open('GET', '/getListOfReservations', false); // 'false' 使请求同步
    request.send(null);

    if (request.status === 200) {
    警报(request.responseText);
    }

    【讨论】:

    • getListOfReservations 实际上并不是一些 servlet 操作映射,而只是 javascript 方法 asynchronousCallbackCall() 的字符串参数。虽然我并没有完全处理 ajax,但我也想知道异步 javascript 函数调用的类比。
    • Eeeck - 同步 Ajax 是最糟糕的用户体验。它在 Ajax 调用期间查找浏览器。它几乎不应该被使用。
    【解决方案3】:

    如果您使用$.ajax 执行异步调用,那么您应该使用属性async: false,这将阻止脚本执行,直到调用完成并返回响应。

    有关$.ajax的更多信息,请参考此链接:

    http://api.jquery.com/jquery.ajax/

    【讨论】:

    • 我没有使用 ajax。我希望在 ready() 中同步一个异步 JavaScript 函数,以便我可以保持(暂停) ready() 以防止页面加载,直到所述函数调用完成。
    • 请提供异步JavaScript函数的代码!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多