函数javascript中的同步

时间:2014-10-29 22:50:11

标签: javascript jquery synchronization

我在不同的js代码部分中有5个不同的ajax请求,只有一个处理程序:

ajaxRequest1
ajaxRequest2
ajaxRequest3
ajaxRequest4
ajaxRequest5
handler

我想达到以下顺序:

如果我调用ajaxRequest1,我应该处理它,并且只有在它之后我才能发出下一个ajaxRequest。

例如它是很好的排序:

start ajaxRequest1
start handler
start ajaxRequest2
start handler
start ajaxRequest3
start handler
start ajaxRequest4
start handler
start ajaxRequest5
start handler

但这很糟糕:

start ajaxRequest1
start ajaxRequest2
start ajaxRequest3
start handler
start handler
start ajaxRequest4
start handler
start handler     
start ajaxRequest5
start handler

javascript是否允许实现它?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你想在运行之前等待一些条件成为现实。如果是这样,可以使用setTimeout循环完成此操作。

   function waitFor(fnReady, fnCallback) {
    var check = function() {
        if (fnReady()) {
            fnCallback();
        }
        else {
            setTimeout(check, 100);  // wait another 100ms, and try again
        }
    };

    check();
}


var result = 0;

function ajaxRequest1() {
    $.ajax(...).done(
         function() { result++; }
    );
}

function ajaxRequest2() {
    $.ajax(...).done(
         function() { result++; }
    );
}

waitFor(function() { return result === 1; }, ajaxRequest2);
waitFor(function() { return result === 2; }, ajaxRequest3);

答案 1 :(得分:0)

听起来像Deferreds的工作。如果你正在使用jQuery,这样的事情应该做你想要的:

function ajaxRequest1() {
    var dfd = $.Deferred();
    $.ajax(...)
        .done(function(response) {
            if (/*response is valid*/)
                dfd.resolve(response);
            else
                dfd.reject();
        });
        .fail(function() {
            dfd.reject();
        });

    return dfd.promise();
}

function ajaxRequest2(response1) {
    // similar to ajaxRequest1, but with different URL, params
}

function ajaxRequest3(response2) {
   // similar to ajaxRequest2, but with different URL, params
}

// Run the tasks sequentially
$.when(ajaxRequest1())
    .then(ajaxRequest2)
    .then(ajaxRequest3)
    .done(function(result1, result2, result3) {
        // all requests have completed
    })
    .fail(function() {
        // handle error
    });

这里,每个ajaxRequestX函数也是处理程序。它检查从前一个请求收到的响应,如果一切正常,它将启动下一个请求。查看jQuery的Deferred对象以获取更多信息。