在JQuery中阻塞

时间:2015-07-29 02:47:04

标签: javascript jquery ajax asynchronous

我试图创建一个基本的阻塞函数,一个需要在发出任何请求之前完成的初始化函数。但是,似乎没有任何内置的方法可以做到这一点 - 我希望像OCaML的Async库这样的东西。

2 个答案:

答案 0 :(得分:0)

我不清楚你要做什么。如果你扩展你的问题,我会相应地调整我的答案。

以下是关于将异步/同步功能串联起来的几个一般想法:

可以将AJAX调用设置为同步,如下所示:

jQuery.ajax({
    ....
     async: false
});   

或者您可以使用promises(在jQuery中称为Deferreds)将依赖于顺序的异步调用串起来,如下所示:

var d1 = $.Deferred();
var d2 = $.Deferred();

$.when( d1, d2 ).done(function ( v1, v2 ) {
    console.log( v1 ); // "Fish"
    console.log( v2 ); // "Pizza"
});

setTimeout(function() {
    d1.resolve( "Fish" );
}, 200);

setTimeout(function() {
    d2.resolve( "Pizza" );
}, 300);

(以上示例改编自https://api.jquery.com/jQuery.when/

另见How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?

答案 1 :(得分:0)

您可以在运行应用程序之前使用jQuery .when .then构造来确保一切准备就绪。

function longRunningAsynchronousAction() {
    return $
        .ajax({
            url: "https://query.yahooapis.com/v1/public/yql",
            dataType: "jsonp",
            data: {
                q: "show tables",
                format: "json"
            }
        }).done(function() { 
        console.log('data loaded');
                           });
}

function initialize(onDoneFn) {
    $
        .when(
            longRunningAsynchronousAction(),
            longRunningAsynchronousAction(),
            longRunningAsynchronousAction()
        )
        .then(onDoneFn);
}

function runApp() {
  console.log('Starting app');
}

initialize(runApp);

示例为jsbin